Floyd算法小结

Floyd算法是一种用于寻找给定的加权图中多源点之间最短路径的算法,算法流程如下所示:
1:从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
2:对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。
把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则G[i,j]=d,d表示该路的长度;否则G[i,j]=无穷大。定义一个矩阵D用来记录所插入点的信息,D[i,j]表示从Vi到Vj需要经过的点,初始化D[i,j]=j。把各个顶点插入图中,比较插点后的距离与原来的距离,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值变小,则D[i,j]=k。在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。
 
对于Floyd算法的代码实现,如下所示(C语言版):

#include<stdio.h>
#include<stdlib.h>
#define max 100000000
int d[1000][1000],path[1000][1000];

int main()
{
int i,j,k,m,n;
int x,y,z;
int sta,end;
scanf("%d%d",&m,&n); //m为结点数,n为边数

//邻接矩阵和路径矩阵初始化化
for(i=1;i<=m;i++){
for(j=1;j<=m;j++)
{
d[i][j]=max;
path[i][j]=j;
}
}


//读入边信息
for(i=1;i<=n;i++){
scanf("%d%d%d",&x,&y,&z);
d[x][y]=z;
d[y][x]=z;
}


//算法的核心部分,注意循环嵌套的顺序
for(k=1;k<=m;k++)
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
{
if(d[i][k]+d[k][j]<d[i][j]){
d[i][j]=d[i][k]+d[k][j];
path[i][j]=path[i][k];
}
}


scanf("%d%d",&sta,&end); //sta为起点,end为终点
for(i=1;i<=m;i++){
for(j=1;j<=i;j++){
if(i!=j)
printf("%d->%d:%d ",i,j,d[i][j]);
}
}
i=sta;
while(sta!=end){
printf("%d->",sta);
sta=path[sta][end];
}
printf("%d:%d",end,d[i][end]);
system("pause");
return 0;
}

原文地址:https://www.cnblogs.com/bywallance/p/5253245.html