void Floyd()
{
int A[MAXV][MAXV],path[MAXV][MAXV];
int i,j,k,n;
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&A[i][j]);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i!=j&&A[i][j]<INF)
path[i][j]=i;
else path[i][j]=-1;
}
}
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(A[i][j]>(A[i][k]+A[k][j]))
{
A[i][j]=A[i][k]+A[k][j];
path[i][j]=path[k][j];//修改最短路径,使它等于最后的那个
}
}
}
//Dispath(A,path,n)
}
void Dispath(int A[][MAXV],int path[][MAXV],int n)
{
int i,j,k,s;
int apath[MAXV],d;//存放最短路径及中间顶点的个数
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(A[i][j]!=INF&&i!=j)
{
printf("从%d到%d的最短路径为",i,j);
k=path[i][j];
d=0;
apath[d]=j;
while(k!-1&&k!=i)
{
d++;
apath[d]=k;
k=path[i][k];
}
d++;
apath[d]=i;
printf("%d",apath[d]);
for(s=d-1;s>=0;s--)
printf(",%d",apath[s]);
printf("\t路径长度为:%d\n",A[i][j]);
}
}
}