Floyd-Warshall 算法-- 最短路径(适合节点密集的图)
由于此算法时间复杂度为O(V³)。大多数情况下不如迪杰斯特拉算法的
。迪杰斯特拉算法适合于节点疏散的图。
演示样例图例如以下:
Step 1 创建节点与边的最短路径结果表(直接可达关系)。数值表示距离。INF表示不可达
|
|
1 |
2 |
3 |
4 |
|
1 |
0 |
8 |
INF |
1 |
|
2 |
INF |
0 |
1 |
INF |
|
3 |
4 |
INF |
0 |
INF |
|
4 |
INF |
2 |
9 |
0 |
Step2 找出全部经过1的路径。更新两点间的最短路径
经过1的路径即全部入度和出度路径的组合,总数为入度×出度:
经过1路径为:
第一条,3-1-2
眼下MIN(3->2)为INF,而MIN(3->1->2)=4+8=12 因此MIN(3->2)为12,由于2有更新,故要递归更新全部从3到2可达点的最短路径。而2可达点仅仅有3,MIN(3->3)为0,因此不须要更新。
第二条,3-1-4
眼下MIN(3->4)为INF,而MIN(3->1->4)=4+1=5,因此MIN(3->4)为5,由于4有更新,故要递归更新全部从3到4的全部可达点的最短路径,而4的可达点为3和2:
MIN(3->3)=0,MIN(3->2)=MIN(3->1->2)=12 > MIN(3->1->4->2)= 7。因此MIN(3->2)=7
找出全部经过1路径的结果为:
|
|
1 |
2 |
3 |
4 |
|
1 |
0 |
8 |
INF |
1 |
|
2 |
INF |
0 |
1 |
INF |
|
3 |
4 |
0 |
||
|
4 |
INF |
2 |
9 |
0 |
Step3 找出全部经过2的路径
第1条,1->2->3
由于MIN(1->3)为INF,而MIN(1->2->3)为9。因此MIN(1->3)为9,由于3有更新,所以须要递归更新全部从1到3可达点的最短路径,由于3的可达点为1,而MIN(1->1)不须要更新,为0。如今看第二条路径:
第二条。4->2->3
因此MIN(4->3)为9,而MIN(4->2->3)为3。因此MIN(4->3)=3,由于3有更新,须要递归更新从4到3可达点的最短路径,由于3的可达点为1,而MIN(4->1)为INF,MIN(4->2->3->1)为7。因此MIN(4->1)为7。由于1有更新,继续递归,1的可达点为4和2,MIN(4->4)保持0;眼下MIN(4->2)为2,而MIN(4->2->3->1->2)=2+1+4+8=15大于2。因此不须要更新。
找出全部经过2的路径后,结果为:
|
|
1 |
2 |
3 |
4 |
|
1 |
0 |
8 |
1 |
|
|
2 |
INF |
0 |
1 |
INF |
|
3 |
4 |
7 |
0 |
5 |
|
4 |
2 |
0 |
Step4 找出全部经过3的路径
第1条。4->3->1
MIN(4->1)为7。而MIN(4->3->1)为13。因此不须要更新
第二条,2->3->1
由于MIN(2->1)为INF,而MIN(2->3->1)为5。因此须要更新MIN(2->1)为5。
由于更新了1,因此须要更新全部从2到1可达点的路径,1的可达点为4和2,MIN(2->2)不须要更新;眼下MIN(2->4)为INF。而MIN(2->3->1->4)为6。因此MIN(2->4)为6。由于更新了4,因此须要递归更新从2到4可达点的路径,4可达点为2和3,MIN(2->2)为0;MIN(2->3)为1小于MIN(2->3->1->4->3)=1+4+1+9=15。故也不须要更新。
所以经过这一步,结果表为:
|
|
1 |
2 |
3 |
4 |
|
1 |
0 |
8 |
9 |
1 |
|
2 |
5 |
0 |
1 |
6 |
|
3 |
4 |
7 |
0 |
5 |
|
4 |
7 |
2 |
3 |
0 |
最后,找出经过4的路径。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
第一条。1->4->2
MIN(1->2)为8,而MIN(1->4->2)为3,因此MIN(1->2)更新为3,由于更新了2。故须要更新全部从1到2可达点的最短路径,2的可达点为3。MIN(1->3)眼下为9。而MIN(1->4->2->3)为4,因此MIN(1->3)更新为4。由于更新了3。故递归更新全部从1到3可达点的最短路径,3的可达点为1,而MIN(1->1)不须要更新保持为0。
第二条,1->4->3
MIN(1->3)为4,而MIN(1->4->3)为10。因此不须要更新。
所以终于结果为:
|
|
1 |
2 |
3 |
4 |
|
1 |
0 |
1 |
||
|
2 |
5 |
0 |
1 |
6 |
|
3 |
4 |
7 |
0 |
5 |
|
4 |
7 |
2 |
3 |
0 |
Floyd-Warshall 算法-- 最短路径(适合节点密集的图)的更多相关文章
- Floyd—Warshall算法
我们用DP来求解任意两点间的最短路问题 首先定义状态:d[k][i][k]表示使用顶点1~k,i,j的情况下,i到j的最短路径 (d[0][i][j]表示只使用i和j,因此d[0][i][j] = c ...
- 图论之最短路径(1)——Floyd Warshall & Dijkstra算法
开始图论学习的第二部分:最短路径. 由于知识储备还不充足,暂时不使用邻接表的方法来计算. 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshal ...
- 数据结构与算法--最短路径之Floyd算法
数据结构与算法--最短路径之Floyd算法 我们知道Dijkstra算法只能解决单源最短路径问题,且要求边上的权重都是非负的.有没有办法解决任意起点到任意顶点的最短路径问题呢?如果用Dijkstra算 ...
- WarShall算法
1.引言 图的连通性问题是图论研究的重要问题之一,在实际中有着广泛的应用.例如在通信网络的联通问题中,运输路线的规划问题等等都涉及图的连通性.因此传递闭包的计算需要一个高效率的算法,一个著名的算法就是 ...
- Gym 101873D - Pants On Fire - [warshall算法求传递闭包]
题目链接:http://codeforces.com/gym/101873/problem/D 题意: 给出 $n$ 个事实,表述为 "XXX are worse than YYY" ...
- 数据结构与算法--最短路径之Bellman算法、SPFA算法
数据结构与算法--最短路径之Bellman算法.SPFA算法 除了Floyd算法,另外一个使用广泛且可以处理负权边的是Bellman-Ford算法. Bellman-Ford算法 假设某个图有V个顶点 ...
- POJ 2253 Frogger(warshall算法)
题意:湖中有很多石头,两只青蛙分别位于两块石头上.其中一只青蛙要经过一系列的跳跃,先跳到其他石头上,最后跳到另一只青蛙那里.目的是求出所有路径中最大变长的最小值(就是在到达目的地的路径中,找出青蛙需要 ...
- 分布式ID系列(5)——Twitter的雪法算法Snowflake适合做分布式ID吗
介绍Snowflake算法 SnowFlake算法是国际大公司Twitter的采用的一种生成分布式自增id的策略,这个算法产生的分布式id是足够我们我们中小公司在日常里面的使用了.我也是比较推荐这一种 ...
- [C++]动态规划系列之Warshall算法
/** * * @author Zen Johnny * @date 2018年3月31日 下午8:13:09 * */ package freeTest; /* [动态规划系列:Warshall算法 ...
随机推荐
- 11.怎样自学Struts2之Struts2验证[视频]
11.怎样自学Struts2之Struts2验证[视频] 之前写了一篇"打算做一个视频教程探讨怎样自学计算机相关的技术",优酷上传不了.仅仅好传到百度云上: http://pan. ...
- nj07---npm
一.如何使用包管理器 Node.js包管理器,即npm是Node.js官方提供的包管理工具,它已经成了Node.js包的标准发布平台,用于Node.js包的发布.传播.依赖控制.(可以下载上面的包也可 ...
- IPS
转自:http://www.ithome.com.tw/node/79293 企業中網路環境的防護,通常都是先有防火牆,再搭配IPS.但是,實際上買得起IPS防護的企業有限,這是因為IPS的價格很昂貴 ...
- Division Game UVA - 11859 Nim
Code: #include<cstdio> #include<algorithm> using namespace std; #define maxn 10005 int n ...
- Centos7(阿里云服务器)安装Anaconda的详细步骤与心得
在本地安装Anaconda的各个版本的文章已经很多,但是感觉不是很详细,因此,在此发发自己在Centos7(阿里云服务器)安装Anaconda的心得和步骤: 注:需要注意的地方会用不同颜色区别. 1. ...
- python3之对本地TXT文件进行增加,删除,修改,查看功能。
由于是初学,代码如有不足,欢迎指出! 本博客记录我的编程之路,记录所学到的知识,分享所学心得! 这是我的一个作业. 首先分析要求: 创建一个TXT文件用于存储账号与密码 实现对文件进行增加,删除,修改 ...
- 简单的 centos7&rhel7 系统初始化脚本
#!/bin/bash #描述: 基于RHEL7¢os7的初始化配置 #读取用户输入的ip read -p "输入你当前Linux的IP地址:" LAST #截取网 ...
- List和iterator的区别
(1)在用Query方法查询的时候,通过HQL语句来得到Query对象,并对Query对象进行操作,首先是用list方法获取到Query的List集合并输出 public void listQuery ...
- [React Native] Use the SafeAreaView Component in React Native for iPhone X Compatibility
In this lesson, you will learn how to use the SafeAreaView component to avoid the sensor cluster (th ...
- Option可选值(一)
//: Playground - noun: a place where people can play import Cocoa class Person { var residence: Resi ...