【POJ】3268 Silver Cow Party

题目链接:http://poj.org/problem?id=3268

题意 :有N头奶牛,M条单向路。X奶牛开party,其他奶牛要去它那里。每头奶牛去完X那里还要返回。去回都是走的最短路。现在问这里面哪头奶牛走的路最长。

题解:对每个奶牛i与X做两次spfa。去回各一次。然后统计最长的。。板子稍微改一改//但是我还是T了好几发,因为初始化数组的时候maxn开大了。。QAQ。改小了就过了。

代码:

 1 #include<iostream>
 2 #include<stack>
 3 #include<vector>
 4 #include<queue>
 5 #include<algorithm>
 6 using namespace std;
 7 const int maxn = 100005;
 8 
 9 vector< pair<int,int> > e[maxn];
10 
11 int n,m,X;
12 int d[maxn],inq[maxn];
13 
14 int spfa(int s,int t){
15     for(int i = 0 ;i < maxn ; i++)
16         inq[i] = 0;
17     for(int i = 0 ; i < maxn ; i++)
18         d[i] = 1e9;
19     queue<int>Q;
20     Q.push(s);d[s] = 0 ;inq[s] = 1;
21     while( !Q.empty() ){
22         int now = Q.front();
23         Q.pop();
24         inq[now] = 0;
25         for(int i = 0; i < e[now].size() ; i++){
26             int v = e[now][i].first;
27             if(d[v] > d[now] + e[now][i].second){
28                 d[v] = d[now] + e[now][i].second;
29                 if(inq[v] == 1)
30                     continue;
31                 inq[v] = 1;
32                 Q.push(v);
33             }
34         }
35     }
36     return d[t];
37 }
38 
39 int main() {
40     scanf("%d%d%d",&n,&m,&X);
41     int x,y,z;
42     for(int i = 0; i < m ;i++){
43         scanf("%d%d%d",&x,&y,&z);
44         //cin>>x>>y>>z;
45         e[x].push_back(make_pair(y,z));
46         //e[y].push_back(make_pair(x,z));
47     }
48 
49     int ans = 0;
50     for(int i = 1 ;i <= n ;i++){
51         if(i == X){
52             continue;
53         }
54         int sum = spfa(X,i);
55         sum += spfa(i,X);
56         ans = max(ans,sum);
57     }
58     cout<<ans<<endl;
59 
60     return 0;
61 }

猜你喜欢

转载自www.cnblogs.com/Asumi/p/9716129.html