算法简述
Floyd算法用于求每一对顶点之间的最短路径,3个for循环就可以。时间复杂度O(n^3) 。Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查Dis(AX) + Dis(XB) < Dis(AB)是否成立,如果成立,证明从A到X再到B的路径比A直接到B的路径短,我们便设置Dis(AB) = Dis(AX) + Dis(XB)。(有向图)
Floyd算法是一种动态规划,所以最外层循环必须是k,也就是作为中间结点。i、j遍历所有的边然后进行更新。
算法代码
const int INF = 0x3f3f3f3f;
const int maxn = 100+5;
int map[maxn][maxn];
int distance[maxn][maxn]; //distance[i][j] 表示vi,vj之间的最短距离
int path[maxn][maxn];
void Floyd()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
distance[i][j] = map[i][j];
if(distance[i][j] < INF)
path[i][j] = i; //j的前驱为i
else
path[i][j] = -1;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(distance[i][k] + distance[k][j] < diatance[i][j])
{
distance[i][j] = distance[i][k] + distance[k][j];
path[i][j] =path[k][j] ; //更新j的前驱为k
}
}
}
总之:无论哪一个最短路径算法,对于无向图依然适用,只是邻接矩阵为对称矩阵。