标签:des style class code java tar
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
最基本的floyd最短路,难点在记录字典序最小的路径.....
有两种路径记录方法:
出始化: fa[a][b]=a 则 fa[a][b]=c 表示 a....c->b
出始化: fa[a][b]=b 则 fa[a][b]=c 表示 a->c....b
根据题意,要选择第二种
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int n;
int g[110][110],b[110];
int fa[110][110];
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(g,63,sizeof(g));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&g[i][j]);
if(g[i][j]==-1)
g[i][j]=INF;
}
}
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
fa[i][j]=j;
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(g[i][j]>g[i][k]+g[k][j]+b[k])
{
g[i][j]=g[i][k]+g[k][j]+b[k];
fa[i][j]=fa[i][k];
}
else if(g[i][j]==g[i][k]+g[k][j]+b[k])
{
fa[i][j]=min(fa[i][j],fa[i][k]);
}
}
}
}
int s,t;
while(scanf("%d%d",&s,&t)!=EOF)
{
if(s==-1&&t==-1) break;
printf("From %d to %d :\nPath: ",s,t);
int next=fa[s][t];
printf("%d",s);
if(s!=t)
{
while(next!=t)
{
printf("-->");
printf("%d",next);
next=fa[next][t];
}
printf("-->%d",t);
}
printf("\nTotal cost : %d\n\n",g[s][t]);
}
}
return 0;
}
HDOJ 1385 Minimum Transport Cost,布布扣,bubuko.com
HDOJ 1385 Minimum Transport Cost
标签:des style class code java tar
原文地址:http://blog.csdn.net/ck_boss/article/details/25337509