标签:min nat work lang one ace ssi segment inpu
Description
Input
Output
Sample Input
4 3
Karlsruhe Stuttgart 100
Stuttgart Ulm 80
Ulm Muenchen 120
Karlsruhe Muenchen
5 5
Karlsruhe Stuttgart 100
Stuttgart Ulm 80
Ulm Muenchen 120
Karlsruhe Hamburg 220
Hamburg Muenchen 170
Muenchen Karlsruhe
0 0
Sample Output
Scenario #1 80 tons Scenario #2 170 tons
题目意思:有n个城市,m条连接两个城市的道路,每条道路有自己的最大复载量。现在问从城市a到城市b,车上的最大载重能为多少。
解题思路:这里并不是求解最短路径,而是要求通行能力(可称为容量)最大的路,这种路可以成为最大容量路,可以用Floyd算法求最短路径的思想求解。
w[i][j]=max(w[i][j],min(w[i][k],w[k][j]))
这里需要好好的思考一下,对于点i和点j,中间点的加入更改的递推式应该取最大值,因为求的就是最大的容量值,而对于新加进来的i-k和k-j必须取小的值,因为小的值才是这条路的容量值,
三重循环遍历之后就求出了每两点之间的最大容量值。注意初始化的时候w应该都为0,因为求的是最大值。
1 #include<cstring> 2 #include<cstdio> 3 #include<algorithm> 4 #define INF 0x3f3f3f3f 5 using namespace std; 6 int w[210][210]; 7 char start[30]; 8 char dest[30]; 9 int n,m; 10 int num; 11 char city[210][30];///城市名 12 void Floyd() 13 { 14 int i,j,k; 15 for(k=0; k<n; k++) 16 { 17 for(i=0; i<n; i++) 18 { 19 for(j=0; j<n; j++) 20 { 21 w[i][j]=max(w[i][j],min(w[i][k],w[k][j])); 22 } 23 } 24 } 25 } 26 int index(char *s)///给城市分配编号 27 { 28 int i; 29 for(i=0; i<num; i++) 30 { 31 if(!strcmp(city[i],s)) 32 { 33 return i; 34 } 35 } 36 strcpy(city[i],s); 37 num++; 38 return i; 39 } 40 int main() 41 { 42 int i,j,limit; 43 int counts; 44 int a,b; 45 counts=1; 46 while(scanf("%d%d",&n,&m)!=EOF) 47 { 48 getchar(); 49 if(n==0) 50 { 51 break; 52 } 53 for(i=0; i<n; i++)///初始化邻接表 54 { 55 for(j=0; j<n; j++) 56 { 57 w[i][j]=0; 58 } 59 } 60 for(i=0; i<n; i++) 61 { 62 w[i][i]=INF; 63 } 64 num=0; 65 for(i=0; i<m; i++) 66 { 67 scanf("%s%s%d",start,dest,&limit); 68 getchar(); 69 a=index(start); 70 b=index(dest); 71 w[a][b]=w[b][a]=limit;///双向 72 } 73 Floyd(); 74 scanf("%s%s",start,dest);///读入起点城市和终点城市 75 a=index(start); 76 b=index(dest); 77 printf("Scenario #%d\n",counts++); 78 printf("%d tons\n",w[a][b]); 79 printf("\n"); 80 } 81 return 0; 82 }
Heavy Cargo POJ 2263 (Floyd传递闭包)
标签:min nat work lang one ace ssi segment inpu
原文地址:https://www.cnblogs.com/wkfvawl/p/9556610.html