最短路算法之Folyd算法
来源:互联网 发布:graphic软件 编辑:程序博客网 时间:2024/06/05 15:43
看到hihocoder上面的解释不错就直接复制过来了。
小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)就是我们所想要求的值,
//输入边的时候一定要注意重边的选择问题/*int u, v, c; scanf("%d %d %d", &u, &v, &c);dis[u][v] = dis[v][u] = min(dis[u][v], c);*/for (int k = 1; k <= n; k++){for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);}}}
- 最短路算法之Folyd算法
- 最短路径之folyd算法
- POJ 1125 Stockbroker Grapevine 最短路folyd算法
- POJ 2240:Arbitrage:folyd最短路算法变形求有向图的盈利环存在
- 最短路算法之Dijkstra
- 最短路之dijkstra 算法
- SPFA算法之最短路。
- 最短路之Dijkstra算法
- 最短路算法之dijkstra
- 最短路之Floyd算法
- 最短路之SPFA算法
- 最短路算法之Floyd
- 最短路之Floyd算法
- 最短路之SPFA算法
- 最短路之Dijkstra算法
- 最短路算法之 Dijkstra算法
- 最短路算法之SPFA算法
- 最短路算法之Dijkstra算法
- linux下底层函数实现MAC、IP地址以及网关地址
- Java灵活文档导出-Freemarker
- 深入javascript面向对象,js的原型链、继承
- Leetcode#41||First Missing Positive
- linux网络编程
- 最短路算法之Folyd算法
- OC中方法与函数的区别以及类的合理设计
- android开发之bitmap使用
- 继承WechatSupport类spring不能加注入
- js用第三方插件打印lodop
- TCP/IP/ICMP等报头结构体
- 【C语言经典实例】-选择排序
- ascii码
- linux网络编程(2)