(【转载】Floyd算法(二)之 C++详解)

Floyd算法

前些天碰巧看Floyd算法 ,看了很多网页,觉得这篇文章里的图很清晰明了,代码没仔细看,此文用来理解算法就很好!
但是 我想知道别人文章之前 绿色的 字是怎么做出来的 :)

原文地址:http://www.cnblogs.com/skywang12345/

弗洛伊德算法介绍

和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。

基本思想
通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。
假设图G中顶点个数为N,则需要对矩阵S进行N次更新。初始时,矩阵S中顶点a[i][j]的距离为顶点i到顶点j的权值;如果i和j不相邻,则a[i][j]=∞。 接下来开始,对矩阵S进行N次更新。第1次更新时,如果"a[i][j]的距离" > “a[i][0]+a[0][j]”(a[i][0]+a[0][j]表示"i与j之间经过第1个顶点的距离"),则更新a[i][j]为"a[i][0]+a[0][j]"。 同理,第k次更新时,如果"a[i][j]的距离" > “a[i][k]+a[k][j]”,则更新a[i][j]为"a[i][k]+a[k][j]"。更新N次之后,操作完成!
单纯的看上面的理论可能比较难以理解,下面通过实例来对该算法进行说明。

弗洛伊德算法图解: (【转载】Floyd算法(二)之 C++详解)以上图G4为例,来对弗洛伊德进行算法演示。
(【转载】Floyd算法(二)之 C++详解)初始状态:S是记录各个顶点间最短路径的矩阵。
第1步:初始化S。
矩阵S中顶点a[i][j]的距离为顶点i到顶点j的权值;如果i和j不相邻,则a[i][j]=∞。实际上,就是将图的原始矩阵复制到S中。
注:a[i][j]表示矩阵S中顶点i(第i个顶点)到顶点j(第j个顶点)的距离。

第2步:以顶点A(第1个顶点)为中介点,若a[i][j] > a[i][0]+a[0][j],则设置a[i][j]=a[i][0]+a[0][j]。
以顶点a[1]6,上一步操作之后,a[1][6]=∞;而将A作为中介点时,(B,A)=12,(A,G)=14,因此B和G之间的距离可以更新为26。

同理,依次将顶点B,C,D,E,F,G作为中介点,并更新a[i][j]的大小。

是第一次发文章,年前刚刚知道LaTeX,但是没有想到CSDN发文是这样的,写这篇文章的时候深深的惊叹,也真的感觉到了自己在这个行业真的是太白了。代码我运行的时候,他自带的例子是运行正确的,如果节点很多就会出现一点错误,所以我就不放代码了。

相关文章:

  • 2021-10-04
  • 2021-11-15
  • 2021-11-30
  • 2022-01-16
  • 2021-11-23
  • 2021-05-29
  • 2021-09-04
  • 2022-12-23
猜你喜欢
  • 2021-06-21
  • 2021-11-06
  • 2022-01-19
  • 2021-08-15
  • 2021-08-22
相关资源
相似解决方案