最短路径——Floyd算法
1. 背景:
Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。
2. 算法介绍:
完全最短路径问题要求找出一个有n个节点的加权连通图中每个节点到其他所有节点之间的最短距离。
可以使用类似于Washall算法的方法来生成这个最短距离矩阵,这就是Floyd算法。 Floyd算法通过一系列n阶矩阵来计算一个n节点加权图的最短距离矩阵。
以下图为例,一起来看一下Floyd算法每步的拓展情况:
根据该有向图可以得到任意两点间的距离矩阵(邻接矩阵),即没有跳板,能直接到达则记录距离,不能直接到达则记为∞,自己到自己的距离为0。如下图所示:
然后一个一个节点考虑,先以a为跳板,重新遍历每两点距离,观察哪些距离可以更新(因为这是有向图,因此不是对称矩阵),如:初始矩阵 b->c 不存在通路,即为 ∞ ,当引入节点a后,以a作为跳板可使,b到c的距离更新为b->a->c ,即为5。同理,我们每次增加一个跳板,不断更新矩阵中的距离:
最终得到任意一个节点到其他节点的最短路径矩阵。
3. 复杂度分析:
一共n个节点,Floyd算法每次都要维护n*n的矩阵,一共循环n次,因此时间复杂度为O(n3).
4. 对比Dijkstra:
其实了解过Dijkstra的话可以发现Dijkstra和Floyd算法相似度还是蛮大的,当然也存在很大区别。
(1)Dijkstra和Floyd都可以找到从一点到另一点的最短路径,只不过区别就是Dijkstra是解决单源最短路径(复杂度为O(n2)),而Floyd能解决任意源最短路径问题。但是只需要遍历N遍Dijkstra,就能找到任意源的最短路径,但是此时的复杂度也就变成O(n3),和Floyd相同。
(2)Dijkstra和Floyd看似思路相同,都是每次增加一个跳板,然后更新两节点间距离。但是两者的方法存在本质区别:Dijkstra是贪心算法自顶向下求解,通过选择将问题归约为小的子问题。而Floyd是动态规划思想,是自底向下。
5. 代码:
#include <cstdio>
#include <vector>
using namespace std;vector<vector<int> > a; // a表示邻接矩阵
vector<vector<int> > d; //保存每对结点之间最短路径
int n; //节点数
// 创建邻接矩阵
void CreateA (){scanf("%d", &n);for(int i = 0; i < n; ++i){vector<int> v;int v1;for(int j = 0; j < n; ++j){scanf("%d", &v1);v.push_back(v1);}a.push_back(v);}
}
void Dis (){for(int i = 0; i < n; ++i){for(int j = 0; j < n; ++j){d[i][j] = a[i][j];}}// 遍历每个节点k,看将该节点作为跳板后是否可以更新节点(距离变短则更新)for(int k = 0; k < n; ++k){for(int i = 0; i < n; ++i){for(int j = 0; j < n; ++j){if(d[i][k] + d[k][j] < d[i][j])d[i][j] = d[i][k] + d[k][j];}}}
}
int main()
{CreateA();Dis();return 0;
}
6. 附录:
代码中涉及了二维vector的操作,若对二维vector操作不熟悉,可参考blog:
https://blog.csdn.net/m0_51339444/article/details/123876749
最短路径——Floyd算法相关推荐
- C++ 实现带权有向图的每对顶点之间的最短路径Floyd算法(完整代码)
基本思想是: 假设求从顶点vi到vj的最短路径. 如果从vi到vj有弧,则从vi到vj存在一条长度为arcs[i][j]的路径,该路径不一定是最短路径,尚需进行n次试探. 首先考虑路径(vi, v0, ...
- 最短路径(Floyd算法)(c/c++)
如果要得到图中各个顶点之间的最短路径,方法1:可以对每一个顶点采用Dijkstra算法:方法2:可以采用Floyd算法,它是一种用来求双源点之间最短路径的算法,采用邻接矩阵来存储图 辅助结构 int ...
- 最短路径--Floyd算法
Floyd算法 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被 ...
- 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?...
简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...
- 最短路径——Floyd算法及优化(蓝桥杯试题集)
*对最短路径问题以及floyd算法.Dijkstra算法不是很理解的同学请移步前几篇博客~ 题目链接: http://lx.lanqiao.cn/problem.page?gpid=T15 问题描述 ...
- 最短路径——Floyd算法HDU Today(hdu2112)
最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径. 算法具体的形式包括: 确定起点的最短路径问题 - 即已知起始结点,求最短路径的问题. 确定终点的 ...
- HDU2066 一个人的旅行【最短路径+Floyd算法】
一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 求最短路径Floyd算法的并行化(解APSP问题)
求最短路径的串行算法在互联网上应该一搜一大堆,也非常简单,几行代码搞定.但Floyd的并行算法却很难搜到,github倒是有一些,但不容易运行成功,这里对这个算法的并行化进行详细的讲解,结合论文以及实 ...
- 多源最短路径--Floyd算法
#include<iostream> #include<cstdio> using namespace std; const int INF = 0x3f3f3f3f; int ...
最新文章
- AI在软硬件开发中的应用落地!
- LeetCode 面试题 03 数组中重复的数字
- 巨蟒python全栈开发-第6天 is==
- 优化MySQL,还是使用缓存?
- kafka调试工具kafkacat的使用
- IT届常用单词读法纠正
- 类Shiro权限校验框架的设计和实现(2)--对复杂权限表达式的支持
- 学生选课系统代码--分析1
- java.util.concurrent.locks.LockSupport
- (十一)RabbitMQ消息队列-如何实现高可用
- 金蝶KIS 14.1 专业版安装教程
- php如何解决高并发问题
- 微信能通过服务器改数据解封吗,【微信新规】微信永久封号官方解封方法
- EVEREST工具---检测硬件
- Java ques: Unknown initial character set index ‘255‘ received from server. Initial client character
- html中加减页码怎么设置,word中如何设置页码
- 计算机启动慢,win7开机速度慢怎么办_win7开机启动慢怎么解决-win7之家
- oracle 递归层次查询
- 照片建模神器 Recap Photo
- 干货 | 软件工程师必知之事 —— 如何定义自己的职业路线?