POJ 1797 Heavy Transportation

题意:n个城市m条路、求从1城市到n城市的最大承载量,现在给出一些城市之间的最大承载量    解释一下:比如说你有3个城市两条路 分别是1到2权值是3,2到3权值是5,那么你从1到3的最大承载量就是3,如果是5的话你从1到2就不行,超重了

思路:转化为求最短路径问题、那么具体怎么实现呢

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 const int qq=1005;
 5 const int MAX=1e9; 
 6 int map[qq][qq];
 7 int dis[qq];
 8 int vis[qq]; 
 9 int n,m;
10 void prim()
11 {
12     memset(vis,0,sizeof(vis));
13     for(int i=1;i<=n;++i)
14         dis[i]=map[1][i];
15     vis[1]=1;
16     int k;
17     for(int i=1;i<=n;++i){
18         int maxn=0;
19         for(int j=1;j<=n;++j)
20             if(!vis[j] && maxn<dis[j])    //因为是求最大承载量、那么 
21                 maxn=dis[k=j];        //在所有可到达的城市中选一个承载量最大的出来、 
22         vis[k]=1;
23     //    printf("%d
",k);
24         if(k==n)    return;
25         for(int j=1;j<=n;++j)
26             if(!vis[j]){                                        //因为你要满足所有的经过的所有城市都不能超重 
27                 int ans=dis[k]<map[k][j]?dis[k]:map[k][j];        //所以得选取两者中较小的一个、 
28                                                                     //map[k][j]代表城市k与城市j建立联系、 
29                 if(dis[j]<ans && map[k][j]!=0)
30                     dis[j]=ans;
31             }
32     }
33 }
34 int main()
35 {
36     int t;scanf("%d",&t);
37     int k=0;
38     while(t--){
39         scanf("%d%d",&n,&m);
40         int x,y,z;
41         for(int i=1;i<=n;++i)
42             for(int j=1;j<=n;++j)
43                 map[i][j]=0;
44         for(int i=0;i<m;++i){
45             scanf("%d%d%d",&x,&y,&z);
46                 map[x][y]=map[y][x]=z;
47         }
48         prim();
49         printf("Scenario #%d:
",++k);
50         printf("%d

",dis[n]);
51     }
52     return 0;
53 }

在更新dis数组时一定要明白当更新数组时取得一定是取得两种之间的最小值、

一点生活的常识把、

另外吧、一种思想到手里一定要想尽办法去实现、不要想着不劳而获

不然就什么也学习不到、

原文地址:https://www.cnblogs.com/sasuke-/p/5458093.html