zoj Heavy Cargo

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


 

你可能感兴趣的:(zoj Heavy Cargo)