问题给出两个城市之间的收费,然后让你求出所给的从一个城市到另外一个城市最小费用的最大值
依旧prim和floyd算法,这里就只给出floyd,转移方程是:dis[i][k]=max(dis[i][k],min(dis[i][j],dis[j][k]));
此题关键一点还是对于城市名字字符串的处理,先输入时候保存,最后还要查询
1 #include <stdio.h>
2 #include <string.h>
3 #define max(a,b) (a)>(b)?(a):(b)
4 #define min(a,b) (a)<(b)?(a):(b)
5 int check(char c[201][31],char a[31])
6 {
7 for(int i=0;c[i][0]!='\0';i++)
8 if(strcmp(c[i],a)==0)return i;
9 return -1;
10
11 }
12 int main()
13 {
14 int n,r,cas=1;
15
16 while(scanf("%d%d",&n,&r)!=EOF)
17 {
18 int n1,n2,rr[200][200]={-1},k,t;
19 char city[201][31]={'\0'},c1[31],c2[31];
20 if(n==0&&r==0)break;
21 for(int i=0,t=0;i<r;i++)
22 {
23 scanf("%s%s%d",c1,c2,&k);
24 n1=check(city,c1);n2=check(city,c2);
25 if(n1==-1){n1=t;strcpy(city[t++],c1);}
26 if(n2==-1){n2=t;strcpy(city[t++],c2);}
27 rr[n1][n2]=k;rr[n2][n1]=k;
28 }
29 // for(int i=0;city[i][0]!='\0';i++)
30 //printf("%s\n",city[i]);
31 for(int i=0;i<n;i++)
32 for(int j=0;j<n;j++)
33 for(int k=0;k<n;k++)
34 {
35 if(rr[i][j]!=-1&&rr[j][k]!=-1)
36 rr[i][k]=max(rr[i][k],min(rr[i][j],rr[j][k]));
37
38 }
39 scanf("%s%s",c1,c2);
40 n1=check(city,c1);n2=check(city,c2);
41 printf("Scenario #%d\n",cas++);
42 printf("%d tons\n\n",rr[n1][n2]);
43 }
44
45 return 0;
46 }