算法——弗洛伊德算法(Floyd-Warshall)(图论)(c++)

这篇具有很好参考价值的文章主要介绍了算法——弗洛伊德算法(Floyd-Warshall)(图论)(c++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(蒟蒻的第四篇文章,希望dalao勿喷)

(希望没问题)

声明:

1.本人变量定义的名称很low

2.本人用的方法也很low

3.但我觉得文章应该不low (盲目自信)

第四篇文章讲讲Floyd算法

Floyd算法是一种寻找最短路径的常见算法,其特点是:短,好理解(虽然其他算法也挺好理解的

思路

Floyd算法的主要思路是在于:

比如你要坐飞机从A城到B城,结果你发现A到B的直达航班要999元!于是你漫无目的地继续看其他航班信息,结果突然发现在A和B中间,还有一个C城!而且A到C和B到C的价格都很便宜,加在一起只需要998元!于是你高兴地购买了一张A到C和一张C到B的机票,省了一块钱诶!

例子有点离谱,但算法的思路大概就是这个样子:在目标的两个点中找到第三个所谓的C点,如果如上面例子一样,要节省一些“钱”的话就更新两个目标点的权值(甚至可以更新原本是∞的权值!

主体代码

其实听起来很牛*的样子(实际上也很牛*,其实主体代码真的很很很很很很很很很很很很短,emmm,可以直接压缩到4行(实际上肯定有人能“压缩到更短”

行了,啥也别说了,上代码!(只写了主体代码

//Floyd-Warshall算法 
	for(int c=1;c<=n;c++) //枚举C点 
		for(int i=1;i<=n;i++) //i j 分别就是例子中的A B城 
			for(int j=1;j<=n;j++)
				book[i][j]=max(book[i][j],book[i][c]+book[c][j]);//判断经过C是否要省一些“钱” 
	//真的只有4行!!! 

但相信大家一看到这个三层循环,就知道事情不简单,时间复杂度O(n^3)!起飞了昂(简单代码漏洞还是大啊!

这里的主体代码的第4行也可以换成(虽然可能没什么用

if(book[i][j]>book[i][c]+book[c][j])
    book[i][j]=book[i][c]+book[c][j];

来练一题

P3371 【模板】单源最短路径(弱化版)

(题目传送门)

转载自洛谷

题目背景

本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779。

题目描述

如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。

输入格式

第一行包含三个整数 n,m,sn,m,s,分别表示点的个数、有向边的个数、出发点的编号。

接下来 mm 行每行包含三个整数 u,v,wu,v,w,表示一条 u \to vu→v 的,长度为 ww 的边。

输出格式

输出一行 nn 个整数,第 ii 个表示 ss 到第 ii 个点的最短路径,若不能到达则输出 2^{31}-1231−1。

输入输出样例

输入 #1

4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4

输出 #1

0 2 4 3

说明/提示

【数据范围】
对于 20\%20% 的数据:1\le n \le 51≤n≤5,1\le m \le 151≤m≤15;
对于 40\%40% 的数据:1\le n \le 1001≤n≤100,1\le m \le 10^41≤m≤104;
对于 70\%70% 的数据:1\le n \le 10001≤n≤1000,1\le m \le 10^51≤m≤105;
对于 100\%100% 的数据:1 \le n \le 10^41≤n≤104,1\le m \le 5\times 10^51≤m≤5×105,1\le u,v\le n1≤u,v≤n,w\ge 0w≥0,\sum w< 2^{31}∑w<231,保证数据随机。

对于真正 100\%100% 的数据,请移步 P4779。请注意,该题与本题数据范围略有不同。

样例说明:

算法——弗洛伊德算法(Floyd-Warshall)(图论)(c++)

图片1到3和1到4的文字位置调换

题目思路 

这个代码我想就不用给了吧(毕竟真么短,但是我相信,只要你看懂了Floyd算法,就一定能……得到几个大大的“TLE

算法缺点

1.三层循环,时间复杂度O(n^3),面对数据变态的题无法全过

2.无法统计负权值(即有权值为负数

优点就不用说了

以后,我也会介绍其他的图论、最短路径的算法(代码比Floyd长,也难理解一些,但确实,时间复杂度普遍都比Floyd低

两位超级牛人

其实呢,Floyd全名 Robert W.Floyd(罗伯特·弗洛伊德),但为什么这个算法全称“Floyd Warshall”呢?

这主要因为还有一位大牛 Stephen Warshall在同一年(实在太巧了)也独立发表了这个算法,于是就把两个人的名字合并在一起,就成了如今的“Floyd Warshall”算法

顺提一嘴,这个弗洛伊德实在是牛,后来(1964年)还和J.W.J. Williams共同发明了堆排序算法(Heap Sort)(可能是我太菜了,有点没听懂文章来源地址https://www.toymoban.com/news/detail-408062.html

到了这里,关于算法——弗洛伊德算法(Floyd-Warshall)(图论)(c++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)

      最短路径,对于图来说,是两顶点之间经过的边数最少的路径;对于网来说,是指两顶点之间经过的边上权值之和最小的路径。路径上第一个顶点为源点,最后一个顶点是终点。   以如下无向图为例:   我们来计算下标为0的顶点,到其他顶点的最短路径,首先定义

    2024年02月06日
    浏览(31)
  • 弗洛伊德(Floyd)算法求个顶点之间最短路径问题(详解+图解)

    具体来说,弗洛伊德算法通过求解所有点对之间的最短路径来实现。在算法开始时,我们假设图中的所有节点之间都是不联通的,即它们之间的距离为无穷大。然后,我们对图进行“松弛”操作,即尝试更新每个节点之间的距离估计值,以寻找更短的路径。具体来说,对于图

    2024年02月08日
    浏览(30)
  • 最短路径——弗洛伊德算法

    对于这类最短路径问题,DIF算法也可以解决,只需要 定义一个二维数组 ,以 数组的横坐标作为有向网顶点的下标 , 循环n次 依次求解各个源点到其余顶点的最短路径, 时间复杂度为O(n^3) 。 由于弗洛伊德算法求解该问题的的时间复杂度同为O(n^3),而且 思路简单及代码实现

    2024年01月23日
    浏览(29)
  • 弗洛伊德循环查找算法-原理

    本文灵感来自哔哩哔哩视频  视频链接: 弗洛伊德循环查找算法 算法代码(java) 弗洛伊德循环查找算法中第二次相遇的地方就是循环的起始点,这个性质的证明是基于数学的原理。这是因为在第一次相遇时,慢指针 `slow` 和快指针 `fast` 已经处于同一个循环内。设链表起点到环

    2024年01月19日
    浏览(31)
  • 弗洛伊德算法(求最短路径)

    在一个加权图中,如果想找到各个顶点之间的最短路径,可以考虑使用弗洛伊德算法。 弗洛伊德算法既适用于无向加权图,也适用于有向加权图。使用弗洛伊德算法查找最短路径时,只允许环路的权值为负数,其它路径的权值必须为非负数,否则算法执行过程会出错。 弗洛

    2024年02月06日
    浏览(29)
  • 今天学习了弗洛伊德算法(floyed)

    我自己写的模板 嘿嘿 Dijkstra算法SPFA算法但是我知道还有这些,但是今天是周末哎,我有点不想学了,我今天学的是比较差劲的一个算法(但是它好像比较好记啊),改天再学其他比较好一点的算法加强自己 输入 输出 后言:提醒自己加权值是分题目来不同权值,不是像示例

    2024年02月11日
    浏览(24)
  • 多源最短路径算法:Floyd-Warshall算法分析

    在有向赋权图中(可以存在 带负权值的路径 ,但不能存在 总权值为负数的环路 ),Floyd-Warshall算法可以求出 任意两个顶点间 的最短路径 假设图中有 N 个顶点,顶点按照 0~N-1 进行编号 算法中使用 二维数组 Dist 来记录点与点之间的最短路径长度, Dist[i][j] 表示第i个顶点到第j个顶点

    2024年02月09日
    浏览(27)
  • 力扣-202. 快乐数解析-弗洛伊德循环查找算法

    题目链接   使用代码测试一下每一代数字  可以发现 归纳一下这些简单数字就可以发现,对于任意一个非快乐数,最终会进入重复循环, ···不难发现,4即之后的结果就是新一轮循环。 那么我的第一个做法是检测4出现的次数 如果4出现次数超过两次, 那么就不是快乐数 感

    2024年01月20日
    浏览(27)
  • 【数据结构】最短路径算法实现(Dijkstra(迪克斯特拉),FloydWarshall(弗洛伊德) )

    最短路径问题 :从在带权有向图G中的某一顶点出发,找出一条通往另一顶点的最短路径,最短也就是沿路径各边的权值总和达到最小。 单源最短路径问题:给定一个图G = ( V , E ) G=(V,E)G=(V,E),求源结点s ∈ V s∈Vs∈V到图 中每个结点v ∈ V v∈Vv∈V的最短路径 针对一个带权

    2024年02月04日
    浏览(39)
  • 【力扣热题100】287. 寻找重复数(弗洛伊德的乌龟和兔子方法)

    刷一道力扣热题100吧 难度中等 https://leetcode.cn/problems/find-the-duplicate-number/?envType=study-plan-v2envId=top-100-liked 一年半前做过这题,但是时间复杂度不够。现在重新学一下 主要是用到了弗洛伊德的乌龟和兔子方法 算法预览: 初始化 :从两个指针开始,“乌龟\\\"和\\\"兔子”,都指向第

    2024年02月05日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包