题目的意思是选择路径并使从 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;
}