Floyd 算法前面有,这篇主要学习记录路径。
不知道为什么这一段代码我最开始这样不行,后来改成用赋值到n就可以了过了。
void Floyd()
{
int i , j , k;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
path[i][j]=j;
path 数组记录路径的,
#include<stdio.h>
#include<string.h>
#define INF 10000
const int N = 105;
int map[N][N],path[N][N],tax[N];
int n;
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 dis = map[i][k] + map[k][j] + tax[k];
if(map[i][j] > dis)
{
map[i][j] = dis;
path[i][j] = path[i][k]; //注意这里,记录路径的。
}
if(dis == map[i][j]) //这个地方是如果有相等的最小值,按字典序小的输出。
if(path[i][j]>path[i][k])
path[i][j] = path[i][k];
}
}
int main()
{
while(scanf("%d",&n),n)
{
for(int i = 0 ; i <= n ; i++ )
for(int j = 0 ; j <= n ; j++ )
map[i][j] = INF;
for(int i = 1 ; i <= n ; i++ )
for(int j = 1 ; j <= n ; j++ )
{
int x ;scanf("%d",&x);
if(x!=-1)map[i][j] = x;
}
for(int i = 1 ; i <= n ; i++ )
scanf("%d",&tax[i]);
Floyd();
int a, b;
while(scanf("%d%d",&a,&b)!=EOF)
{
if(a==-1&&b==-1)
break;
printf("From %d to %d :\n",a,b);
printf("Path: %d",a);
int t=a;
while(t!=b)
{
printf("-->%d",path[t][b]);
t=path[t][b];
}
printf("\n");
printf("Total cost : %d\n\n",map[a][b]);
}
}
return 0;
}