标签:
5 0 3 22 -1 4 3 0 5 -1 -1 22 5 0 9 20 -1 -1 9 0 4 4 -1 20 4 0 5 17 8 3 1 1 3 3 5 2 4 -1 -1 0
From 1 to 3 : Path: 1-->5-->4-->3 Total cost : 21 From 3 to 5 : Path: 3-->4-->5 Total cost : 16 From 2 to 4 : Path: 2-->1-->5-->4 Total cost : 17
本题的大意是个运送货物需要交两部分费用,过路费和过城市费,如输出样例输入5,然后输入一个5*5的矩阵代表过路费,再输入5个数,代表过城市费,要求花的费用最低,并输出行走路线。
#include<stdio.h>
#define INL 0x3f3f3f3f
#define min(a,b) (a)>(b)?(b):(a)
int x[100][101],n,f[100],path[100][100];
void floyd()
{
	int i,j,k;
	for(i=1;i<=n;i++)
		   for(j=1;j<=n;j++)
		    path[i][j]=j;
	for(k=1;k<=n;k++)
	   for(i=1;i<=n;i++)
	     for(j=1;j<=n;j++)
	        {
	        	int h=x[i][k]+x[k][j]+f[k];
	        	if(x[i][j]>h)
	        	{
	        		x[i][j]=h;
	        		path[i][j]=path[i][k];
	        	}
	        	else if(x[i][j]==h)
	        	path[i][j]=min(path[i][j],path[i][k]);
	        }
}
int main()
{
	while(scanf("%d",&n),n)
	{
		int i,j,k,a,b,c;
		for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
		{
			scanf("%d",&x[i][j]);
			     if(x[i][j]==-1)
			          x[i][j]=INL;
		}
			for(j=1;j<=n;j++)
			   scanf("%d",&f[j]); 
			       floyd();
		while(scanf("%d%d",&b,&c),b!=-1)
		{
		      int w=b;
			printf("From %d to %d :\nPath: ",b,c);
				 while(w!=c)
				 {
				 	 printf("%d-->",w);
				 	 w=path[w][c];
				 } 
		    printf("%d\n",w);
			printf("Total cost : %d\n\n",x[b][c]);
	        }
	}
	return 0;
} 版权声明:本文为博主原创文章,未经博主允许不得转载。
hdoj1385 Minimum Transport Cost
标签:
原文地址:http://blog.csdn.net/l15738519366/article/details/47839561