弗洛伊德最短路径算法理解

(涉及到前面讲过的 warshall 算法)  floyd 要求图中每个定点之间的最短路径,其比迪杰斯特拉算法在这一问题上要先进的地方就在于各个点之间的最短路径是同步更新的。在 i j 中间依次加入从 0 n-1 的点,如果设加入的点为 k ,当 i->k (之前算好的 i k 的最短路径) +k->j 小于原来的 i->j 时,更新 i->j 。最后得到每两个点之间的最短路径。具体算法步骤看书上,我重点讲下面的东西。   假设 0->6->1->2 0 6 的最短路径,那么利用贪心算法的思想 0->6 一定为 0 6 的最短路径,路径上每一个点到下一个点都走的相互间的最短路径,当 k 0 n-1 依次作为中转点时,一定可以找到两个点之间只通过一个点中转后的最短路径,其中若 k==i k==j 可看做没有中转,所以 0 1 的最短路径 0->1 就可以替换 0->6->1 (因为 6 是那个最小路径中转点),所以 0->6->1->2 变为 0->1->2 ,然后以 1 作为中转点时又缩短为 0->2 ,这样就可以证明该路径确实为 0 2 的最短路径,因为每一个点都会作为中转点,因此两个点之间的最短路径都能利用缩短思想证明能求的出来,这里的缩短思想和 warshall 算法真的好像。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
弗洛伊德最短路径算法是一种用于解带权有向图中任意一对顶点间最短路径算法。该算法的时间复度为O(n^3),相对于迪杰斯特拉算法来说,弗洛伊德算法的形式更为简单。 弗洛伊德算法的基本思想是通过一个三重循环,依次考察每个顶点作为中间节点的情况,更新每一对顶点间的最短路径长度。具体步骤如下: 1. 读入一个有向图的带权邻接矩阵,建立有向图。 2. 初始化一个二维数组d,用于存储每一对顶点间的最短路径长度。将邻接矩阵复制给d。 3. 通过一个三重循环,依次考察每个顶点作为中间节点的情况。假设当前中间节点为k,对于每一对顶点i和j,比较d[i][k] + d[k][j]与d[i][j]的大小,将较小值更新为d[i][j]。 4. 继续进行第3步,直到所有的顶点都被考察为中间节点,即完成了所有顶点间的最短路径计算。 5. 输出最终的d数组,即为每一对顶点间的最短路径长度。 需要注意的是,在计算最短路径的过程中,可以将每个顶点是否可达记录下来,以便后续判断是否存在从源点至相应顶点的路径。如果不存在路径,则输出-1。对于某个顶点到其本身的最短路径长度,输出0。 在题目描述中,输入的第一行为正整数n,表示图中共有n个顶点。接下来的n行为n个用空格隔开的整数,表示带权邻接矩阵。输出为n行n个整数,表示源点至每一个顶点的最短路径长度。 参考资料: [1] 引用[1] [2] 引用[2] [3] 引用[3]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值