Floyd算法用于解决每一对顶点之间的最短路径,其时间复杂度为 O(n3)。
其基本思想:
假设求从顶点Vi到Vj的最短路径。如果从Vi到Vj有弧,则从Vi到Vj存在一条长度为e[i][j]的路径,该路径不一定是最短的,需要进行n次的试探。首先考虑路径(Vi,V0,Vj)是否存在。如果存在,比较(Vi,Vj),小的保存下来。当下一次循环开始的时候又在加一个点,重复执行。
其中该算法的核心部分为
for(int k = 1; k <= VertexNum ; k++)
for(int i = 1 ; i <= VertexNum; i++)
for(int j = 1; j <= VertexNum; j++)
{
if(e[i][j] < e[i][k] + e[k][j])
e[i][j] = e[i][k] + e[k][j];
}
Floyd算法实现
void Dispath(int A[][MaxVertexNum],int path[][MaxVertexNum],int n)
{
int i,j;
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
if (A[i][j]==INF)
{
if (i!=j)
{
printf("从%d到%d没有路径\n",i,j);
}
}
else
{
printf(" 从%d到%d=>路径长度:%d路径:",i,j,A[i][j]);
printf("%d,",i);
Ppath(path,i,j); //输出i→j的路径,格式为 i .. j
printf("%d\n",j);
}
}
}
}
void Ppath(int path[][MaxVertexNum],int i,int j)
{
int k;
k=path[i][j];
if (k==-1)
{
return;
}
Ppath(path,i,k);
printf("%d,",k);
Ppath(path,k,j);
}
void Floyd(MGraph G)
{
int A[MaxVertexNum][MaxVertexNum],path[MaxVertexNum][MaxVertexNum];
int i,j,k;
for (i=0;i<G.n;i++)
{
for (j=0;j<G.n;j++)
{
A[i][j]=G.edges[i][j];
path[i][j]=-1;
}
}
for (k=0;k<G.n;k++)
{
for (i=0;i<G.n;i++)
{
for (j=0;j<G.n;j++)
{
if (A[i][j]>A[i][k]+A[k][j])
{
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k; //path数组用来存放前驱
}
}
}
}
Dispath(A,path,G.n);
}
引用
1 严蔚敏吴伟民 数据结构(c语言版)