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中只有一个源点,以后每求得一条最短路径 , ...
随机推荐
- OpenSuSe开启sshd服务
需要测试OpenSuSE11 x64上mysql性能,发现很多东西与centos以及红帽有差别.其中最切身的就是sshd服务的开启. 安装好OpenSuSE 11后,发现ssh连接不上去,可以ping ...
- neo4j简单学习
阅读更多 背景 最近在一些论坛或者新闻里看到了neo4j,一种擅长处理图形的数据库. 据说非常适合做一些join关系型的查询,所以抽空也看了下相关文档,给自己做个技术储备. 过程 深入学习之前,先在网 ...
- 在知乎上看到的几个关于C的奇淫技巧
有一个鲜为人知的运算符叫”趋向于”, 写作“-->”.比如说如果要实现一个倒数的程序,我们可以定义一个变量x,然后让它趋向与0: 输出: 然后我们把 "x-->0" 换 ...
- Raspberry Pi 4B 安装QT5和qtCreator
https://blog.csdn.net/coekjin/article/details/52049273 sudo apt-get install qt5-default sudo apt-get ...
- Joda-Time 入门
Joda-Time 令时间和日期值变得易于管理.操作和理解.事实上,易于使用是 Joda 的主要设计目标.其他目标包括可扩展性.完整的特性集以及对多种日历系统的支持.并且 Joda 与 JDK 是百分 ...
- word2vec 原理浅析 及高效训练方法
1. https://www.cnblogs.com/cymx66688/p/11185824.html (word2vec中的CBOW 和skip-gram 模型 浅析) 2. https://ww ...
- KiCAD泪滴
KiCAD泪滴 KiCAD没有自带的补泪滴功能,必须先下载一个插件,然后才能进行泪滴操作 链接 提取码:ey8o 1.下载泪滴插件,解压后将整个文件夹复制到目录 C:\Program Files\K ...
- Bash: Removing leading zeroes from a variable
old=" # sed removes leading zeroes from stdin new=$(echo $old | sed 's/^0*//')
- css创建
CSS 创建 当读到一个样式表时,浏览器会根据它来格式化 HTML 文档. 如何插入样式表 插入样式表的方法有三种: 外部样式表(External style sheet) 内部样式表(Interna ...
- PHP ftp_login() 函数
定义和用法 ftp_login() 函数登录 FTP 服务器. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE 和一个警告. 语法 ftp_login(ftp_connection,us ...