当前位置: 首页 > news >正文

数据结构:以一个例题演示弗洛伊德算法

例 8.5.2 利用弗洛伊德算法,对图 8.5.5 中左侧的带权有向图求最短路径,给出每一对顶点之间的最短路径及其路径长度在求解过程中的变化。

在这里插入图片描述

图 8.5.5 带权图和邻接矩阵

【解】

根据图 8.5.5 中的带权有向图,可得所对应的邻接矩阵 g g g ,如图 8.5.5 右侧图所示。

根据弗洛伊德算法,所对应的 4 × 4 4\times 4 4×4 的矩阵序列是: A − 1 , A 0 , A 1 , A 2 , A 3 ( n = 4 ) \pmb{A}_{-1},\pmb{A}_0,\pmb{A}_1,\pmb{A}_2,\pmb{A}_3~(n=4) A1,A0,A1,A2,A3 (n=4)

(1) A − 1 \pmb{A}_{-1} A1 ,不经过任何中间结点,任何两个顶点之间的距离,即为邻接矩阵
A − 1 = g = [ 0 1 ∞ 4 ∞ 0 9 2 3 5 0 8 ∞ ∞ 6 0 ] \begin{split} \pmb{A}_{-1}=g=\begin{bmatrix}0&1&\infty&4\\\infty&0&9&2\\3&5&0&8\\\infty&\infty&6&0 \end{bmatrix} \end{split} A1=g= 031059064280
用矩阵 path − 1 \text{path}_{-1} path1 保存此时的最短路径,注意,此时意味着两个顶点之间是否有直接地、不经过中间顶点的路径。如果顶点 i i i 和顶点 j j j 之间有路径,则 p a t h − 1 [ i ] [ j ] = i \pmb{path}_{-1}[i][j]=i path1[i][j]=i ,否则 p a t h − 1 [ i ] [ j ] = − 1 \pmb{path}_{-1}[i][j]=-1 path1[i][j]=1

  • 元素 A − 1 [ 0 ] [ 0 ] \pmb{A}_{-1}[0][0] A1[0][0] (下标按照图 3 右侧的邻接矩阵方式表示),说明顶点 0 到顶点 0 没有路径,则 p a t h − 1 [ 0 ] [ 0 ] = − 1 \pmb{path}_{-1}[0][0]=-1 path1[0][0]=1
  • 元素 A − 1 [ 0 ] [ 1 ] = 1 \pmb{A}_{-1}[0][1]=1 A1[0][1]=1 ,说明顶点 0 到顶点 1 的路径权值是 1 ,有路径,则 p a t h − 1 [ 0 ] [ 1 ] = 0 \pmb{path}_{-1}[0][1]=0 path1[0][1]=0
  • 元素 A − 1 [ 0 ] [ 2 ] = ∞ \pmb{A}_{-1}[0][2]=\infty A1[0][2]= ,说明顶点 0 到顶点 2 没有路径,则 p a t h − 1 [ 0 ] [ 2 ] = − 1 \pmb{path}_{-1}[0][2] =-1 path1[0][2]=1
  • ⋯ \cdots

用上述方法,即可得到矩阵 p a t h − 1 \pmb{path}_{-1} path1 。具体实现的时候,可以按照行号观察 A − 1 \pmb{A}_{-1} A1 ,在某一行中,其元素非 0 0 0 或者非 ∞ \infty ,则说明该行号到所对应列有路径,那么对应到 p a t h − 1 \pmb{path}_{-1} path1 中的相应位置元素即为 A − 1 \pmb{A}_{-1} A1 中的该行的行号;否则为 − 1 -1 1 。所以得到矩阵 p a t h − 1 \pmb{path}_{-1} path1 如下:
p a t h − 1 = [ − 1 0 − 1 0 − 1 − 1 1 1 2 2 − 1 2 − 1 − 1 3 − 1 ] \pmb{path}_{-1}=\begin{bmatrix}-1&0&-1&0\\-1&-1&1&1\\2&2&-1&2\\-1&-1&3&-1\end{bmatrix} path1= 1121012111130121
(2) A 0 \pmb{A}_0 A0 ,以顶点 0 为中间点,任何两个顶点之间的最短距离,即 A 0 [ i , j ] = min ⁡ ( A − 1 [ i , j ] , A − 1 [ i , 0 ] ) + A − 1 [ 0 , j ] ) \pmb{A}_0[i,j]=\min(\pmb{A}_{-1}[i,j],\pmb{A}_{-1}[i,0])+\pmb{A}_{-1}[0,j]) A0[i,j]=min(A1[i,j],A1[i,0])+A1[0,j])
A 0 [ 0 , 0 ] = 0 A 0 [ 0 , 1 ] = min ⁡ ( A − 1 [ 0 , 1 ] , A − 1 [ 0 , 0 ] + A − 1 [ 0 , 1 ] ) = 1 A 0 [ 0 , 2 ] = min ⁡ ( A − 1 [ 0 , 2 ] , A − 1 [ 0 , 0 ] + A − 1 [ 0 , 2 ] ) = ∞ ⋮ A 0 [ 2 , 1 ] = min ⁡ ( A − 1 [ 2 , 1 ] , A − 1 [ 2 , 0 ] + A − 1 [ 0 , 1 ] ) = 4 ⋮ \begin{split} &\pmb{A}_0[0,0] = 0 \\&\pmb{A}_0[0,1]=\min(\pmb{A}_{-1}[0,1],\pmb{A}_{-1}[0,0]+\pmb{A}_{-1}[0,1])=1 \\&\pmb{A}_0[0,2]=\min(\pmb{A}_{-1}[0,2],\pmb{A}_{-1}[0,0]+\pmb{A}_{-1}[0,2])=\infty \\&~\vdots \\&\pmb{A}_0[2,1]=\min(\pmb{A}_{-1}[2,1],\pmb{A}_{-1}[2,0]+\pmb{A}_{-1}[0,1])=4 \\&~\vdots \end{split} A0[0,0]=0A0[0,1]=min(A1[0,1],A1[0,0]+A1[0,1])=1A0[0,2]=min(A1[0,2],A1[0,0]+A1[0,2])= A0[2,1]=min(A1[2,1],A1[2,0]+A1[0,1])=4 
最终得到 A 0 \pmb{A}_0 A0 如下:
A 0 = [ 0 1 ∞ 4 ∞ 0 9 2 3 4 0 7 ∞ ∞ 6 0 ] \pmb{A}_0=\begin{bmatrix}0&1&\infty&4\\\infty&0&9&2\\3&4&0&7\\\infty&\infty&6&0\end{bmatrix} A0= 031049064270
如果 A 0 [ i , j ] = A 1 [ i , j ] \pmb{A}_0[i,j]=\pmb{A}_1[i,j] A0[i,j]=A1[i,j] ,则说明路径没有调整,即 p a t h 0 [ i , j ] = p a t h − 1 [ i , j ] \pmb{path}_0[i,j]=\pmb{path}_{-1}[i,j] path0[i,j]=path1[i,j]

否则,路径已经调整,即:经过顶点 k k k 的路径较短,则 A k [ i ] [ j ] = A k − 1 [ i ] [ k ] + A k − 1 [ k ] [ j ] \pmb{A}_k[i][j]=\pmb{A}_{k-1}[i][k]+\pmb{A}_{k-1}[k][j] Ak[i][j]=Ak1[i][k]+Ak1[k][j] path k [ i ] [ j ] = a = path k − 1 [ k ] [ j ] \text{path}_k[i][j]=a=\text{path}_{k-1}[k][j] pathk[i][j]=a=pathk1[k][j] ,所以有: p a t h 0 [ i , j ] = p a t h − 1 [ 0 , j ] \pmb{path}_0[i,j]=\pmb{path}_{-1}[0,j] path0[i,j]=path1[0,j]

由以上规则,可得矩阵 p a t h \pmb{path} path
p a t h 0 = [ − 1 0 − 1 0 − 1 − 1 1 1 2 0 − 1 0 − 1 − 1 3 − 1 ] \pmb{path}_{0}=\begin{bmatrix}-1&0&-1&0\\-1&-1&1&1\\2&0&-1&0\\-1&-1&3&-1\end{bmatrix} path0= 1121010111130101
(3) A 1 \pmb{A}_1 A1 ,以顶点 1 为中间点,任何两点之间的最短距离,即 A 1 [ i , j ] = min ⁡ ( A 0 [ i , j ] , A 0 [ i , 1 ] + A 0 [ 1 , j ] ) \pmb{A}_1[i,j]=\min(\pmb{A}_0[i,j],\pmb{A}_0[i,1]+\pmb{A}_0[1,j]) A1[i,j]=min(A0[i,j],A0[i,1]+A0[1,j])
A 1 [ 0 , 0 ] = 0 A 1 [ 0 , 1 ] = min ⁡ ( A 0 [ 0 , 1 ] , A 0 [ 0 , 1 ] + A 0 [ 1 , 1 ] ) = 1 A 1 [ 0 , 2 ] = min ⁡ ( A 0 [ 0 , 2 ] , A 0 [ 0 , 1 ] + A 0 [ 1 , 2 ] ) = 10 A 1 [ 0 , 3 ] = min ⁡ ( A 0 [ 0 , 3 ] , A 0 [ 0 , 1 ] + A 0 [ 1 , 3 ] ) = 3 A 1 [ 1 , 0 ] = min ⁡ ( A 0 [ 1 , 0 ] , A 0 [ 1 , 1 ] + A 0 [ 1 , 0 ] ) = ∞ ⋮ \begin{split} &\pmb{A}_1[0,0]=0 \\&\pmb{A}_1[0,1]=\min(\pmb{A}_0[0,1],\pmb{A}_0[0,1]+\pmb{A}_0[1,1])=1 \\&\pmb{A}_1[0,2]=\min(\pmb{A}_0[0,2],\pmb{A}_0[0,1]+\pmb{A}_0[1,2])=10 \\&\pmb{A}_1[0,3]=\min(\pmb{A}_0[0,3],\pmb{A}_0[0,1]+\pmb{A}_0[1,3])=3 \\&\pmb{A}_1[1,0]=\min(\pmb{A}_0[1,0],\pmb{A}_0[1,1]+\pmb{A}_0[1,0])=\infty \\~&\vdots \end{split}  A1[0,0]=0A1[0,1]=min(A0[0,1],A0[0,1]+A0[1,1])=1A1[0,2]=min(A0[0,2],A0[0,1]+A0[1,2])=10A1[0,3]=min(A0[0,3],A0[0,1]+A0[1,3])=3A1[1,0]=min(A0[1,0],A0[1,1]+A0[1,0])=
最终得到:
A 1 = [ 0 1 10 3 ∞ 0 9 2 3 4 0 6 ∞ ∞ 6 0 ] \pmb{A}_1=\begin{bmatrix}0&1&10&3\\\infty&0&9&2\\3&4&0&6\\\infty&\infty&6&0\end{bmatrix} A1= 03104109063260
比较 A 1 \pmb{A}_1 A1 A 0 \pmb{A}_0 A0 ,若相等,则 p a t h 1 [ i , j ] = p a t h 0 [ i , j ] \pmb{path}_1[i,j]=\pmb{path}_0[i,j] path1[i,j]=path0[i,j] ,否则 p a t h 1 [ i , j ] = p a t h 0 [ 1 , j ] \pmb{path}_1[i,j]=\pmb{path}_0[1,j] path1[i,j]=path0[1,j] ,由此得到:
p a t h 1 = [ − 1 0 1 1 − 1 − 1 1 1 2 0 − 1 1 − 1 − 1 3 − 1 ] \pmb{path}_1=\begin{bmatrix}-1&0&1&1\\-1&-1&1&1\\2&0&-1&1\\-1&-1&3&-1\end{bmatrix} path1= 1121010111131111
依照上述方法,继续计算 A 2 , A 3 \pmb{A}_2,\pmb{A}_3 A2,A3 ,最终得到:
A 3 = [ 0 1 9 3 11 0 8 2 3 4 0 6 9 10 6 0 ] p a t h 3 = [ − 1 0 3 1 2 − 1 3 1 2 0 − 1 1 2 0 3 − 1 ] \begin{split} &\pmb{A}_3=\begin{bmatrix}0&1&9&3\\11&0&8&2\\3&4&0&6\\9&10&6&0\end{bmatrix} \\&\pmb{path}_3=\begin{bmatrix}-1&0&3&1\\2&-1&3&1\\2&0&-1&1\\2&0&3&-1\end{bmatrix} \end{split} A3= 011391041098063260 path3= 1222010033131111
A 3 [ i , j ] \pmb{A}_3[i,j] A3[i,j] 可以得出每一对顶点之间的最短距离,由 p a t h 3 [ i , j ] \pmb{path}_3[i,j] path3[i,j] 能找出对应着该对顶点之间的路径。

例如: A 3 [ 1 , 2 ] = 8 \pmb{A}_3[1,2]=8 A3[1,2]=8 ,即顶点 1 到顶点 2 的最短路径长度是 8。对应的路径: p a t h 3 [ 1 , 2 ] = 3 \pmb{path}_3[1,2]=3 path3[1,2]=3 ,即顶点 2 的前驱是顶点 3,即路径 < 3 , 2 > <3,2> <3,2> 。由于是从顶点 1 出发,顶点 3 是中间点。而从 1 → 3 1\to3 13 的路径: p a t h 3 [ 1 , 3 ] = 1 \pmb{path}_3[1,3]=1 path3[1,3]=1 ,即顶点 3 的前驱是 1。故从 1 → 2 1\to2 12 的路径是 < 1 , 3 , 2 > <1,3,2> <1,3,2> ,这条路径最短,长度是 8。

相关文章:

  • Docker Swarm 容器与普通 Docker 容器的网卡差异
  • 命令update-alternatives
  • 关于数字信号与图像处理——基于Matlab的图像增强技术
  • vue3 watch和watchEffect 的用法和区别
  • 【T型三电平仿真】SVPWM调制
  • MCS-51单片机汇编语言编程指南
  • 黑马商城(五)微服务保护和分布式事务
  • PHP异常处理__RuntimeException运行时错误
  • ZLMediaKit流媒体服务器
  • c++:线程(std::thread)
  • PHP中的ReflectionClass讲解【详细版】
  • GPT-SoVITS 使用指南
  • Linux网络服务之防火墙
  • Datawhale AI春训营 世界科学智能大赛--合成生物赛道:蛋白质固有无序区域预测 小白经验总结
  • (附邀请码)探秘扣子空间:排盘优美,魅力无限
  • C#学习第17天:序列化和反序列化
  • 数据结构0基础学习堆
  • PHP获取大文件行数
  • 实现Azure Function安全地请求企业内部API返回数据
  • springAi---智能客服
  • 外卖江湖战火重燃,骑手、商家、消费者在“摇摆”什么?
  • 王毅将出席中国一中亚外长第六次会晤、金砖国家外长会晤和第十五次金砖国家安全事务高级代表会议
  • 特朗普称无意解雇鲍威尔,美国股债汇反弹、黄金高位下跌
  • 专访|前伊核谈判顾问:伊朗不信任美国,任何核协议都会有中俄参与
  • 天地图新版上线对公众、企业有何用?自然资源部总规张兵详解
  • 商务部24日下午将举行发布会,介绍近期商务领域重点工作情况