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中只有一个源点,以后每求得一条最短路径 , ...
随机推荐
- Cococs2d-x学习路线
| 版权声明:本文为博主原创文章,未经博主允许不得转载. Cocos2D-X推荐书: Cocos2d-x权威指南
- swoole安装异步reids
/usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config --enable-async ...
- 快速调通支付宝当面付Demo
1.访问如下地址: https://auth.alipay.com/login/ant_sso_index.htm?goto=https%3A%2F%2Fopenhome.alipay.com%2Fp ...
- java入门之:Hello World
import java.util.Scanner; public class HelloWorld{ public static void main(String[] args){ //向终端打印he ...
- 免费开源的获取代理ip项目
地址:https://github.com/awolfly9/IPProxyTool 根据教程获取ip,项目使用Python语言写的,正好可以让前些日子学了点Python皮毛的我长长见识: ip都是会 ...
- 【目录】ASP.NET Core 2.1 入门教程
ASP.NET Core 2.1 快速学习.入门系列教程,这个入门系列教程为了帮助大家快速上手ASP.NET Core. 本教程包含且不限于: 使用VS Code开发ASP.NET Core应用 AS ...
- Java中this的基础用法
update on 2019-07-07 在Java核心技术一书中看到调用方法时this作为隐式参数传入的. 突然间许多问题都懂了 比如:方法的多态 父类变量指向子类对象的引用 对象变量指向的实际类型 ...
- .babelrc配置例子
{ "presets":[ ["es2015",{"modlues":false}], "react", ], &quo ...
- linux上安装php phpredis扩展
linux 下安装redis以及php Redis扩展 环境配置: centos6.0 nginx/1.0.0 php/5.3.8 mysql/5.5.17 步骤一.下载redis 可以去http:/ ...
- tengine日志切割-配置分钟级别日志自动切割
tengine日志切割-配置分钟级别日志自动切割 安装 以安装最新版本的tengine-2.1.2版本 下载连接 tengine支持许多变量 变量 $conn_requests 当前请求在长连接上的序 ...