题目的意思是选择路径并使从 i 到 j 的路径上最小承受重量最大化。
动态规划,类似floyd,用dist[ i ][ j ]表示从 i 到 j 的最小重量,枚举中间节点 k ,则状态转移方程可写为dist[ i ][ j ] = max ( dist[ i ] [ j ], min ( dist[ i ][ k ],dist[ k ][ j ]))。
index为命名函数,将英文名转换为标号。
#include <stdio.h> #include <string.h> #define INF 5000000 int n,r,num,dist[300][300]; char city[300][50]; char start[50],dest[50]; int max(int a,int b) { if(a>b) return a; else return b; } int min(int a,int b) { if(a>b) return b; else return a; } int index(char* s) { int i; for(i=0;i<num;i++) if(strcmp(city[i],s)==0) return i; strcpy(city[i],s); num++; return i; } void floyd() { int k,i,j; for(k=0;k<n;k++) for(i=0;i<n;i++) for(j=0;j<n;j++) dist[i][j]=max(dist[i][j],min(dist[i][k],dist[k][j])); } int main() { int i,j,w,k,sum=0; while(1) { num=0; scanf("%d%d",&n,&r); if(n==0&&r==0) break; for(i=0;i<n;i++) for(j=0;j<n;j++) dist[i][j]=0; for(i=0;i<n;i++) dist[i][i]=INF; for(k=0;k<r;k++) { scanf("%s%s%d",start,dest,&w); i=index(start); j=index(dest); dist[j][i]=dist[i][j]=w; } floyd(); scanf("%s%s",start,dest); i=index(start); j=index(dest); sum++; printf("Scenario #%d\n",sum); printf("%d tons\n\n",dist[i][j]); } return 0; }