您的位置:首页 > 其它

hdoj 1385 输出 最短路的最小字典序路径

2014-09-28 14:53 211 查看
#include<stdio.h>
#include<string.h>
#define inf 99999999
int a[201][201];
int path[201][201];
int b[201],n;
void init()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
path[i][j]=j;
}
int main()
{

while(scanf("%d",&n),n)
{
int i,j,c,d,k,x;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]==-1)
a[i][j]=inf;
}
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
init();
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(a[i][j]>a[i][k]+a[k][j]+b[k])
{
a[i][j]=a[i][k]+a[k][j]+b[k];
path[i][j]=path[i][k];
}
else if(a[i][j]==a[i][k]+a[k][j]+b[k]&&path[i][j]>path[i][k])
{
path[i][j]=path[i][k];//这里path[path[i][k]][j]=...=j
}
}
while(scanf("%d%d",&c,&d)==2)
{
if(c==-1&&d==-1)
break;
printf("From %d to %d :\n",c,d);
printf("Path: ");
x=c;
printf("%d",c);
while(x!=d)
{
printf("-->%d",path[x][d]);
x=path[x][d];
}
printf("\nTotal cost : %d\n\n",a[c][d]);
}
}
return 0;
}


用邻接矩阵记录路径,用二维的可以保留每段路的开头

或结尾,初始化path[i][j]=j;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: