求图1所示的图G中的任意两个顶点的最短通路长度。
#include <stdio.h>
int main()
{
int e[10][10],p[10][10]={0};
int k,i,j;
for(i = 1;i <= 6;i++)
{
for(j = 1;j <= 6;j++)
{
e[i][j] = 10000;
}
}
/*初始化边的长度*/
e[1][2] = e[2][1] = 1;
e[1][4] = e[4][1] = 2;
e[2][4] = e[4][2] = 4;
e[2][3] = e[3][2] = 3;
e[3][4] = e[4][3] = 1;
e[3][5] = e[5][3] = 2;
e[3][6] = e[6][3] = 2;
e[5][6] = e[6][5] = 2;
e[4][5] = e[5][4] = 3;
e[1][1]=e[2][2]=e[3][3]=e[4][4]=e[5][5]=e[6][6]=0;
printf("A0:\n");//初始状态
for(i = 1;i <= 6;i++)
{
for(j = 1;j <= 6;j++)
{
if(e[i][j]==10000)
printf(" #");//#用来表示无穷大
else
printf("%5d",e[i][j]);
}
printf("\n");
}
for(k = 1;k <= 6;k++)
{
for(i = 1;i <= 6;i++)
{
for(j = 1;j <= 6;j++)
{
if(i!=j)
{
if(e[i][j] > e[i][k]+e[k][j])
{
e[i][j] = e[i][k]+e[k][j];
p[i][j] = k;
}
}
}
}
printf("A%d:\n",k);
for(i = 1;i <= 6;i++)
{
for(j = 1;j <= 6;j++)
{
if(e[i][j]==10000)
printf(" #");
else
printf("%5d",e[i][j]);
}
printf("\n");
}
for(i = 1;i <= 6;i++)
{
for(j = 1;j <= 6;j++)
{
if(p[i][j]==k)
printf("p[%d %d]=%d\n",i,j,p[i][j]);
}
}
printf("\n");
}
return 0;
}
A0: 0 1 # 2 # # 1 0 3 4 # # # 3 0 1 2 2 2 4 1 0 3 # # # 2 3 0 2 # # 2 # 2 0 A1: 0 1 # 2 # # 1 0 3 3 # # # 3 0 1 2 2 2 3 1 0 3 # # # 2 3 0 2 # # 2 # 2 0 p[2 4]=1 p[4 2]=1 A2: 0 1 4 2 # # 1 0 3 3 # # 4 3 0 1 2 2 2 3 1 0 3 # # # 2 3 0 2 # # 2 # 2 0 p[1 3]=2 p[3 1]=2 A3: 0 1 4 2 6 6 1 0 3 3 5 5 4 3 0 1 2 2 2 3 1 0 3 3 6 5 2 3 0 2 6 5 2 3 2 0 p[1 5]=3 p[1 6]=3 p[2 5]=3 p[2 6]=3 p[4 6]=3 p[5 1]=3 p[5 2]=3 p[6 1]=3 p[6 2]=3 p[6 4]=3 A4: 0 1 3 2 5 5 1 0 3 3 5 5 3 3 0 1 2 2 2 3 1 0 3 3 5 5 2 3 0 2 5 5 2 3 2 0 p[1 3]=4 p[1 5]=4 p[1 6]=4 p[3 1]=4 p[5 1]=4 p[6 1]=4 A5: 0 1 3 2 5 5 1 0 3 3 5 5 3 3 0 1 2 2 2 3 1 0 3 3 5 5 2 3 0 2 5 5 2 3 2 0 A6: 0 1 3 2 5 5 1 0 3 3 5 5 3 3 0 1 2 2 2 3 1 0 3 3 5 5 2 3 0 2 5 5 2 3 2 0
A6即为最终所求