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\n",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:\n",++k); 50 printf("%d\n\n",dis[n]); 51 } 52 return 0; 53 }
在更新dis数组时一定要明白当更新数组时取得一定是取得两种之间的最小值、
一点生活的常识把、
另外吧、一种思想到手里一定要想尽办法去实现、不要想着不劳而获
不然就什么也学习不到、