poj 3268 Silver Cow Party 題解
阿新 • • 發佈:2019-01-28
大意:有n個牧場,編號1到n,每個牧場有一頭奶牛。現在所有奶牛要到編號為x的牧場聚會,路徑是單向的,奶牛都很聰明,只走最短路徑,問哪頭奶牛來回走的路徑之和最大,輸出這個最大值。
思路:建立兩個鄰接表(一個出邊表,一個入邊表),然後分別對兩個鄰接表使用一次SPFA,得到的路徑長度分別存到dist_o[]和dist_i[]。dist_o + dist_i的最大值就是問題結果。
程式碼
PS:第一次寫SPFA,做題時建鄰接表有個指標搞錯了找了半天bug,操蛋。。程式碼也寫的很糟糕。以後要多寫多練
#include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> using namespace std; #define N 1000 #define INF 1000000000 int vis_i[N + 5], dist_i[N + 5], vis_o[N + 5], dist_o[N + 5]; int n, m; struct node { int to, val; node * next; }; node * e_i[N + 5]; node * e_o[N + 5]; void INIT(int v) { for (int i = 1; i <= n; i++) { if (v == i) { dist_i[i] = dist_o[i] = 0; } else { dist_i[i] = dist_o[i] = INF; } } } void SPFA_i(int v) { queue<int> q; q.push(v); while (!q.empty()) { int a = q.front(); q.pop(); vis_i[a] = 0; node * p = e_i[a]; //cout << a; while (p) { //cout << " " << p->to; if (dist_i[a] < INF && dist_i[a] + p->val < dist_i[p->to]) { dist_i[p->to] = dist_i[a] + p->val; if (!vis_i[p->to]) { vis_i[p->to] = 1; q.push(p->to); } } p = p->next; } //cout << endl; } } void SPFA_o(int v) { queue<int> q; q.push(v); while (!q.empty()) { int a = q.front(); q.pop(); vis_o[a] = 0; node * p = e_o[a]; //cout << a; while (p) { //cout << " " << p->to; if (dist_o[a] < INF && dist_o[a] + p->val < dist_o[p->to]) { dist_o[p->to] = dist_o[a] + p->val; if (!vis_o[p->to]) { vis_o[p->to] = 1; q.push(p->to); } } p = p->next; } //cout << endl; } } int main() { int x; while (cin >> n >> m >> x) { for (int i = 0; i <= N; i++) { e_i[i] = e_o[i] = NULL; } node * p; for (int i = 1; i <= m; i++) { int a, b, t; scanf("%d %d %d",&a, &b, &t); p = new node; p->to = a; p->val = t; p->next = NULL; if (e_i[b] == NULL) e_i[b] = p; else { p->next = e_i[b]; e_i[b] = p; } p = new node; p->to = b; p->val = t; p->next = NULL; if (e_o[a] == NULL) e_o[a] = p; else { p->next = e_o[a]; e_o[a] = p; } } INIT(x); SPFA_i(x); SPFA_o(x); int ans = 0; for (int i = 1; i <=n; i++) { dist_i[i] += dist_o[i]; } sort(dist_i + 1, dist_i + n + 1); cout << dist_i[n] << endl; } return 0; }