hdu 1385 Minimum Transport Cost(输出字典序最短路径)
#include <stdio.h>
#define MAXN 100
int N,g[MAXN][MAXN],tax[MAXN],post[MAXN][MAXN];
void init()
{
int i,j;
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
{
scanf("%d",&g[i][j]);
post[i][j]=j;
}
}
for(i=1;i<=N;i++) scanf("%d",&tax[i]);
}
void floyd()
{
int i,j,k;
for(k=1; k<=N; k++)
{
for(i=1;i<=N;i++)
{
if( i == k || g[i][k]==-1 ) continue;
for(j=1;j<=N;j++)
{
if( k == j || i == j || g[k][j] == -1 ) continue;
int t = g[i][k] + g[k][j] + tax[k];
if(g[i][j] == -1 || g[i][j] > t)
{
g[i][j] = t;
post[i][j] = post[i][k];
}
else if(g[i][j]==t && post[i][k]<post[i][j])
{
post[i][j]=post[i][k];
}
}
}
}
}
void print(int x,int y)
{
printf("Path: %d",x);
while(post[x][y]!=y)
{
printf("-->%d",post[x][y]);
x=post[x][y];
}
printf("-->%d\n",y);
}
int main()
{
while(scanf("%d",&N),N)
{
init();
floyd();
int i,j;
while(scanf("%d %d",&i,&j),(i!=-1 && j!=-1))
{
printf("From %d to %d :\n",i,j);
if(i==j) printf("Path: %d\n",i);
else print(i,j);
printf("Total cost : %d\n\n",g[i][j]);
}
}
return 0;
}
浙公网安备 33010602011771号