【POJ】1797 Heavy Transportation

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

题意:n个城镇,m条路上能承载的最大重量。现在问你从1到n的最大承重量。

题解:spfa的变体。

假设当前1->当前点的承载量是d[v] 比 从1->k的承载量d[now] 小 或者 是比当前的承载量e[now][i].second小,就更新。

然后注意一下初始化的时候d[]的大小。具体的看代码吧。QWQ板子好用。

代码:

 1 #include<iostream>
 2 #include<stack>
 3 #include<vector>
 4 #include<queue>
 5 #include<algorithm>
 6 using namespace std;
 7 const int maxn = 2e5+7;
 8 
 9 vector< pair<int,int> > e[maxn];
10 
11 int n,m;
12 int d[maxn],inq[maxn];
13 
14 void init(){
15     for(int i = 0; i < maxn; i++)
16         e[i].clear();
17     for(int i = 0 ;i < maxn ; i++)
18         inq[i] = 0;
19     for(int i = 0 ; i < maxn ; i++)
20         d[i] = 0;
21 }
22 
23 int main() {
24     int T;
25     cin>>T;
26     int cas = 1;
27     while(T--){
28         cin>>n>>m;
29         init();
30         int x,y,z;
31         for(int i = 0; i < m ;i++){
32             cin>>x>>y>>z;
33             e[x].push_back(make_pair(y,z));
34             e[y].push_back(make_pair(x,z));
35         }
36         int s,t;
37         //cin>>s>>t;
38         s = 1;
39         t = n;
40         queue<int>Q;
41         Q.push(s);
42         d[s] = 1e9 ;    //比小的话就初始化最大。
43         inq[s] = 1;
44         while( !Q.empty() ){
45             int now = Q.front();
46             Q.pop();
47             inq[now] = 0;
48             for(int i = 0; i < e[now].size() ; i++){
49                 int v = e[now][i].first;
50                 //改。
51                 if(d[v] < min( d[now] , e[now][i].second)){
52                     d[v] = min(d[now] , e[now][i].second);
53                     if(!inq[v]){
54                         inq[v] = 1;
55                         Q.push(v);
56                         continue;
57                     }
58                 }
59             }
60 
61         }
62         printf("Scenario #%d:\n",cas++);
63         cout<<d[t]<<endl;
64         cout<<endl;
65     }
66     return 0;
67 }

猜你喜欢

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