图最短路径算法:(Floyd)弗洛伊德算法:过程讲解,路径打印

         

目录

1.已知一个无向图如下图所示,D为其邻接表,p为中介矩阵

 2.首先以v0为中介点,求出两两节点的直接路径长度和途径V0的简介路径的长度,取最小值去更新邻接表。

 3.以v1为中介点,继续更新P,D两个矩阵

 4.以v2为中介点,继续更新P,D两个矩阵

4.以v3为中介点,继续更新P,D两个矩阵

5.因此,最后的D矩阵就是各节点间的最短路径大小。

6.路径打印


1.已知一个无向图如下图所示,D为其邻接表,p为中介矩阵

图最短路径算法:(Floyd)弗洛伊德算法:过程讲解,路径打印
标题

 2.首先以v0为中介点,求出两两节点的直接路径长度和途径V0的简介路径的长度,取最小值去更新邻接表。

该例中,不需要更新D矩阵

图最短路径算法:(Floyd)弗洛伊德算法:过程讲解,路径打印

 3.以v1为中介点,继续更新P,D两个矩阵

由下图可知,v0,v2的直接路径为10 < v0,v1+v1,v2 = 7 ,所以更新D(v0,v2)= 7,D(v2,v0)=7.同时更新P矩阵的0,2和2,0区域的中介点为1,同理对于(v0,v3)的更新同上。(上图是无向图)

图最短路径算法:(Floyd)弗洛伊德算法:过程讲解,路径打印

 4.以v2为中介点,继续更新P,D两个矩阵

可见,没有发生更新

图最短路径算法:(Floyd)弗洛伊德算法:过程讲解,路径打印

4.以v3为中介点,继续更新P,D两个矩阵

可以看出,(0,1)和(0,2)发生更新

图最短路径算法:(Floyd)弗洛伊德算法:过程讲解,路径打印

 

5.因此,最后的D矩阵就是各节点间的最短路径大小。

6.路径打印

对于矩阵P,记录的是每次发生更新的时候所使用的中介点。

比如(v0-v1)的路径,中介点是v1,他的含义是,(v0-v1)经过v1,也就是说,(v0,v1)直接连接的时候路径最短,故path(v0,v1)=v0->v1;

而对于path(v0,v2),p[0,2] = 3,也就是说,path(v0,v2)经过了v3点,即path(v0,v2)=v0->...->v3->v2,这个时候,只需要在看v3之前的中介点是哪一个就可以了,我们可以看出p[0,3] = 1,也就是说 v3之前是v1节点,更新path(v0,v2)=v0->...->v1->v3->v2;

此时p[0,1] = 1 标识他的中介点是他自身,因此path(v0,v2)=v0->v1->v3->v2

本文所使用的图例和研算过程以及代码可在github获取

https://github.com/dyingstraw/graph