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