最短路径——Floyd算法

最短路径——Floyd算法

可以用来求带权图和无权图

Floyd算法:求出每一对顶点之间的最短路径

使用动态规划思想,将问题的求解分为多个阶段

第一个矩阵就是图的邻接矩阵

第二个矩阵表示两个顶点之间的中转点

遍历上一个阶段留下来的矩阵A,对于上一个矩阵A当中的每一个具体的元素我们都进行:

若 A^(k-1)[i] [j]>A^(k-1)[i] [k]+A^(k-1)[k] [j]

则 A^(k)[i] [j] = A^(k-1)[i] [k] + A^(k-1)[k] [j];

​ path^(k)[i] [j] = k

否则A^(k) 和 path^(k)保持原值

A(1)[2][1]>A(1)[2][0]+A(1)[0][1]=11

A(0)[2][1]=11;

path(0)[2][1]=0;

A(0)[0][2]>A(0)[0][1]+A(0)[1][2]=10

A(1)[0][2]=10;

path(1)[0][2]=1;

A(1)[1][0]>A(1)[1][2]+A(1)[2][0]=9

A(2)[1][0]=9;

path(2)[1][0]=2;

Floyd算法核心代码

//。。。。准备工作,初始化矩阵A和path
for(int k=0;k<n;k++){ //考虑以vk作为中转点
for(int i=0;i<n;i++){ //遍历整个矩阵,i为行号,j为列号
for(int j=0;j<n;j++){
if(A[i][j]>A[i][k]+A[k][j]){ //以vk作为中转点的路径更短
A[i][j] = A[i][k]+A[k][j]; //更新最短路径长度
path[i][j] = k; //中转点
}
}
}
}

Floyd算法实例

练习:floyd算法用于负权图

//。。。。准备工作,初始化矩阵A和path
for(int k=0;k<n;k++){ //考虑以vk作为中转点
for(int i=0;i<n;i++){ //遍历整个矩阵,i为行号,j为列号
for(int j=0;j<n;j++){
if(A[i][j]>A[i][k]+A[k][j]){ //以vk作为中转点的路径更短
A[i][j] = A[i][k]+A[k][j]; //更新最短路径长度
path[i][j] = k; //中转点
}
}
}
}

不能解决的问题

带有“负权值回路”的图

这种图可能没有最短路径

知识回顾

本文作者:Jev_0987

本文链接:https://www.cnblogs.com/jev-0987/p/13213497.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Jev_0987  阅读(455)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起