hiho一下 第二十四周---最短路径·二:Floyd算法
来源:互联网 发布:深入理解java构造器 编辑:程序博客网 时间:2024/06/05 09:42
最短路径·二:Floyd算法
- 样例输入
5 121 2 9672 3 9003 4 7714 5 1962 4 7883 1 6371 4 8832 4 825 2 6471 4 1982 4 1815 2 665
- 样例输出
0 280 637 198 394 280 0 853 82 278 637 853 0 771 967 198 82 771 0 196 394 278 967 196 0
描述
万圣节的中午,小Hi和小Ho在吃过中饭之后,来到了一个新的鬼屋!
鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路。
由于没有肚子的压迫,小Hi和小Ho决定好好的逛一逛这个鬼屋,逛着逛着,小Hi产生了这样的问题:鬼屋中任意两个地点之间的最短路径是多少呢?
提示:其实如果你开心的话,完全可以从每个节点开始使用Dijstra算法_(:з」∠)_。输入
每个测试点(输入文件)有且仅有一组测试数据。
在一组测试数据中:
第1行为2个整数N、M,分别表示鬼屋中地点的个数和道路的条数。
接下来的M行,每行描述一条道路:其中的第i行为三个整数u_i, v_i, length_i,表明在编号为u_i的地点和编号为v_i的地点之间有一条长度为length_i的道路。
对于100%的数据,满足N<=10^2,M<=10^3, 1 <= length_i <= 10^3。
对于100%的数据,满足迷宫中任意两个地点都可以互相到达。
输出
对于每组测试数据,输出一个N*N的矩阵A,其中第i行第j列表示,从第i个地点到达第j个地点的最短路径的长度,当i=j时这个距离应当为0。
分析:Floyd模板题。
hiho一下——Floyd算法:
小Ho道:“你说的很有道理,我只需要从每个节点开始使用Dijstra算法就可以了!”
小Hi摇摇头道:“解决问题不是关键,学到知识才是关键,而且知识本身也远远没有掌握学习的方法重要!”
小Ho只得答道:“好的好的,听你说便是了!”
于是小Hi便开心道:“这次要说的算法叫做Floyd算法,是一种用于求图结构上任意两点间最短距离的算法!”
小Ho嘀咕道:“你都写标题上了,能不知道么?”
小Hi强行装作没听到,继续说道:“这个算法的核心之处在于数学归纳法——MinDistance(i, j)之间最短路径中可以用到的节点是一点点增加的!”
“你这话每一个字我都听得懂,但是这句话为什么我听不懂呢……”小Ho无奈道。
“那我这么说吧,首先,最开始的时候,MinDistance(i, j)——即从第i个点到第j个点的最短路径的长度,拥有一个限制:这条路径不能经过任何节点。”小Hi道。
“那就是说如果从i个点到第j个点之间没有直接相连的边的话,这个长度就是无穷大咯?”小Ho总结道:“只需要把输入的边填进MinDistance中即可!”
“对!”小Hi满意于小Ho的上道,继续说道:“然后我放开限制,我允许MinDistance(i, j)——从第i个点到第j个点的最短路径的长度,拥有的限制,变为:这条路径仅允许经过1号节点。”
“这个也简单,对于两个节点i, j,我只需要比较MinDistance(i, j)原来的值和MinDistance(i, 1)+MinDistance(1, j)的值,取较小的一个作为新的MinDistance(i, j)就可以了——毕竟原来的MinDistance都是不经过任何节点,那么这样求出来的新的MinDistance(i, j)只有可能经过1号节点。”
“那么接下来就是关键的了,我将限制继续放宽——路径仅允许经过1、2号节点。”小Hi继续说道。
“那其实也没有任何变化吧,对于两个节点i, j,我只需要比较MinDistance(i, j)原来的值和MinDistance(i, 2)+MinDistance(2, j)的值,取较小的一个作为新的MinDistance(i, j),之所以可以这样是因为,原来的MinDistance都是在限制“仅允许经过1号节点”下,求出来的,所以新求出来的MinDistance(i, j)也只有可能经过1、2号节点!“
“那我继续放开限制呢?”小Hi问道。
“也没有什么区别了,每放开一个新的节点k允许作为路径中的节点,就对于任意的i, j,用MinDistance(i, k)+MinDistance(k, j)去更新MinDistance(i, j),直到1..N号节点都被添加进限制,此时也就等于没有限制了,那么这个时候的MinDistance(i, j)就是我们所想要求的值,写成伪代码就是这样!”
for k = 1 .. N for i = 1 .. N for j = 1 .. N 若i, j, k各不相同 MinDistance[i, j] = min{MinDistance[i, j], MinDistance[i, k] + MinDistance[k, j]}
“看来你已经很明白了呢!”小Hi嘿嘿一笑,往鬼屋深处跑了去——那么接下来就是小Ho利用求出的最短路径,去找到小Hi的时候了!
注:上文摘自:hihoCoder 之 hiho一下
AC代码:
#include <iostream>#include <cstdio>#include <algorithm>using namespace std;#define INF 123456789long long a[1005][1005]; //任意两点间的最短路径长度int main(){// freopen("in.txt","r", stdin); int n, m, x, y, t; while(scanf("%d%d", &n, &m)!=EOF){ for(int i=1; i<=m; i++) for(int j=1; j<=n; j++){ a[i][j] = INF; if(i == j) a[i][j] = 0; } for(int i=1; i<=m; i++){ scanf("%d%d%d", &x, &y, &t); if(a[x][y] > t) a[x][y] = a[y][x] = t; } for(int k=1; k<=n; k++) //Floyd求任两点之间的最短路径 for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) a[i][j] = min(a[i][j], a[i][k] + a[k][j]); for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ if(j>1) printf(" "); printf("%lld", a[i][j]); } printf("\n"); } } return 0;}
hiho一下,是不是很厉害呀^_^
- hiho一下 第二十四周---最短路径·二:Floyd算法
- HIHO #1089 : 最短路径·二:Floyd算法
- hiho 24 最短路径 二 Floyd算法
- hiho刷题日记——第二十四天最短路径·二:Floyd算法
- hiho刷题日记——第二十五天最短路径·三:SPFA算法
- hihoCoder 1089 : 最短路径·二:Floyd算法
- # hihocoder #1089 : 最短路径·二:Floyd算法
- hihocoder 1089 : 最短路径·二:Floyd算法
- hihocoder #1089 : 最短路径·二:Floyd算法
- hihoCoder - 1089 - 最短路径·二:Floyd算法
- hihoCoder 1089 最短路径·二:Floyd算法
- #1089 : 最短路径·二:Floyd算法
- hihoCoder 1089 : 最短路径·二:Floyd算法
- hiho一下 第二十三周---最短路径·一:Dijkstra算法
- 总结一下最短路径的弗洛伊德算法(Floyd)
- hihoCoder - 1089 - 最短路径·二:Floyd算法 (floyd算法!!)
- Floyd最短路径算法
- 最短路径(Floyd算法)
- 细节决定成败-mysql中的时间存储(datetime,timestamp,int)
- Android学习笔记(七) android颜色的设定
- Android 常见Bug及Solutions备忘
- 自定义异常
- eclipse编译hadoop错误:Input path does not exist: hdfs://192.168.184.21:9001/user/xxxx/input
- hiho一下 第二十四周---最短路径·二:Floyd算法
- jstorm基本概念
- 链表(13)----判断链表是否有环,并返回环入口节点
- PHP开发APP接口(一)
- 供应链厂商信息-2014
- SQLCipher错误之java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.
- arm与dsp通信
- 地图比例尺知识
- Xcode6 ios8的定位新特性