Warshall算法和Floyd算法
不用说这两位都是冷门算法……毕竟O(n^3)的时间复杂度算法在算法竞赛里基本算是被淘汰了……而且也没有在这个算法上继续衍生出其他的算法…
有兴趣的话:click here..
话说学离散的时候曾经有个把warshall算法简化到1/2时间的想法……不过懒得去翻了,现在想想本来这两个不用矩阵而用位运算的话速度不知道比我那个方法快多少倍……
嘛,切入正题吧,先讲warshall算法,其用来计算有向图的传递闭包,不知道概念的请去百度(躺
之前在学离散的时候还是花了点时间来研究这个算法的,但是仔细看了下书上的就发现和书上写的有些不一样,下面讲讲我知道的那种和书上的那种:
我知道的那种:
将有向图的邻接矩阵进行相乘操作,每乘一次保存结果,原本的矩阵称为R(1),再乘以R(1)称为R(2),再乘以R(1)称为R(3)…直到取到R(n-1)为止。将R1….Rn-1取并,得出相连矩阵结果。
原理,易证,将邻接矩阵相乘所得为比当前路线高一阶的相连矩阵,假设R1为所有路径为1的通路,那么R2就是所有路径为2的通路。。。Rn-1就是所有路径为n-1的通路。因为只有n个节点,假设求得路线不存在环,那最多为n-1长度,可从之前结果获得,假设存在环,那么环的结果再之前便已经取得。无论怎样,其并结果绝对包含所有节点的链接关系。
书上新看到的:
for k in vertex
for i in row
for j in col
如果点i,k.col存在相连关系,k.row,j存在相连关系,那么这个点就是可以被连上的。
同样的,floyd也是这个尿性,不过里面得改一下:
若能相连,看看是不是比现在的值小,小的就换上。
嘛,怎么说肯定不是很理解,所以我就用例子说明一下把:

这样的一张图,邻接矩阵的样式为:
a b c d
a 0 n 3 n
b 2 0 n n
c n 7 0 1
d 6 n n 0
布尔值的样式是:
a b c d
a 0 n 1 n
b 1 0 n n
c n 1 0 1
d 1 n n 0
那么,warshall的做法是,先统计第1行和第1列,发现(d,c)列对应的(a,c)(第一行),和(d,a)(第一列)都为1,则(d,c)变为1,同理,(b,c)变为1,那么第一轮的结果是:
a b c d
a 0 n 1 n
b 1 0 1 n
c n 1 0 1
d 1 n 1 0
第二轮:
a b c d
a 0 n 1 n
b 1 0 1 n
c 1 1 1 1
d 1 n 1 0
第三轮:
a b c d
a 1 1 1 1
b 1 1 1 1
c 1 1 1 1
d 1 1 1 1
至此,已经没有进行第四轮的必要,故这是一个全通图。floyd的思路与其类似,不过是判断是否两个关联值加起来是否小于当前值,小于的话那就更新,不然不更新。
Warshall算法和Floyd算法的更多相关文章
- 算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
一.名称 动态规划法应用 二.目的 1.掌握动态规划法的基本思想: 2.学会运用动态规划法解决实际设计应用中碰到的问题. 三.要求 1.基于动态规划法思想解决背包问题(递归或自底向上的实现均可): 2 ...
- 最短路径——Dijkstra算法和Floyd算法
Dijkstra算法概述 Dijkstra算法是由荷兰计算机科学家狄克斯特拉(Dijkstra)于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图(无 ...
- 【转载】Dijkstra算法和Floyd算法的正确性证明
说明: 本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节 本人算法菜鸟一枚,提供的证明仅是自己的思路,不保证正确,仅供参考,若有错误,欢迎拍砖指正 ----------- ...
- Dijkstra算法和Floyd算法的正确性证明
说明: 本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节 本人算法菜鸟一枚,提供的证明仅是自己的思路,不保证正确,仅供参考,若有错误,欢迎拍砖指正 ------------- ...
- 最短路径Dijkstra算法和Floyd算法整理、
转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径—Dijkstra算法和Floyd算法 Dijks ...
- 【转】最短路径——Dijkstra算法和Floyd算法
[转]最短路径--Dijkstra算法和Floyd算法 标签(空格分隔): 算法 本文是转载,原文在:最短路径-Dijkstra算法和Floyd算法 注意:以下代码 只是描述思路,没有测试过!! Di ...
- 最短路径Dijkstar算法和Floyd算法详解(c语言版)
博客转载自:https://blog.csdn.net/crescent__moon/article/details/16986765 先说说Dijkstra吧,这种算法只能求单源最短路径,那么什么是 ...
- 最短路径—Dijkstra算法和Floyd算法
原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最后边附有我根据文中Dijkstra算法的描述使用jav ...
- 最短路径—大话Dijkstra算法和Floyd算法
Dijkstra算法 算法描述 1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , ...
随机推荐
- spark优化——依赖包传入HDFS_spark.yarn.jar和spark.yarn.archive的使用
一.参数说明 启动Spark任务时,在没有配置spark.yarn.archive或者spark.yarn.jars时, 会看到不停地上传jar,非常耗时:使用spark.yarn.archive可以 ...
- Oracle或PL/SQL自动断开连接解决参考
ORACLE自动断开数据库连接解决办法 方法一.直接修改资源配置文件 分三个步骤在sqlplus环境下完成. 第一步,查询资源文件,找到CONNECT_TIME所在的pro ...
- python之chardet验证编码格式
在处理字符串时,常常会遇到不知道字符串是何种编码,如果不知道字符串的编码就不能将字符串转换成需要的编码 pip install chardet 举例子 import chardet import ur ...
- JNI 在Android Studio利用NDK编译运行一个简单的c库
NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西:另外就是为了效率更加高些.如果你在Eclipse+ADT下开发过NDK就能体会到要么是配置NDK还要下载Cygwin,配置Cygwin ...
- Oracle 环境部署 以及数据库创建 ,用户新建和权限分配
1.右键我的电脑--->属性--->高级系统设置 2.环境变量---->新建 总共配置三个变量 (1)变量名 ORACLE_HOME 变量值 G:\app\TH\product\11 ...
- linux的锁比较
spinlock spinlock介绍 spinlock又称自旋锁,线程通过busy-wait-loop的方式来获取锁,任时刻只有一个线程能够获得锁,其他线程忙等待直到获得锁.spinlock在多 ...
- spring 结合 redis 例子 (转)
好了费话不多说了,介绍下spring 结合redis是怎么操作数据的 这里我用了maven管理,由于简单嘛,依赖下包就行了..不用单独去依赖包,成了我的习惯 好了,下面是pom的代码 <proj ...
- leetcode-第14周双周赛-1271-十六进制魔术数字
自己的提交: class Solution: def toHexspeak(self, num: str) -> str: num = hex(int(num)) num = str(num)[ ...
- Jmeter-【JSON Extractor】-响应结果中数组多个相同key取值
一.请求返回样式 二.取所有option的值 三.查看结果
- swiper轮播箭头垂直居中
取消懒加载 for (var i in $('.p01-s9 .lazyload')) { $('.p01-s9 .lazyload').eq(i).attr('src',$('.p01-s9 .la ...