求解完全最短路径的Floyd算法

关键词:Floyd算法,动态规划



以下是本篇文章正文内容


一、算法针对的问题和应用

1.针对问题

完全最短路径问题(all-pairs shortest-paths problem):
给定一个加权连通图(无向的或有向的),找到从每个顶点到其他所有顶点之间的距离(最短路径的长度)

2.应用

(1)通信(基站选址规划)
(2)交通网络
(3)运筹学
(4)计算机游戏(路径规划)

二、算法介绍

1.一些概念

(1)权重矩阵W:有权图的权重矩阵
wij:权重矩阵中第i行第j列,代表从第i个顶点到第j个顶点之间的路径长度。
在这里插入图片描述

(2)距离矩阵D:记录最短路径长度的矩阵(n阶)
dij:距离矩阵中第i行第j列,代表从第i个顶点到第j个顶点之间最的路径长度。
在这里插入图片描述

(3)以下过程里的D(0)、D(1)…D(k),其中k代表:中间顶点的编号不大于k(先看过程再来理解)。

2.算法讲解

(1)k=4

过程详解
电脑这个矩阵说明:不包含中间顶点(此时的k=0)的最短路径长度。【在框住的内容里,有 {b–>a,a–>c}=5,{d–>a,a–>c}=9,这是要为D(1)进行更新的内容,见下图】
在这里插入图片描述这个矩阵说明:中点顶点(此时只有a)的编号不大于1(此时的k=1)的最短路径长度。【在框住的内容里,有{c–>b,b–>a}=9,{c–>b,b–>c}=12>0,故在D(2)只更新c–>a】
手机这个矩阵说明:中间顶点(此时为a和b)的编号不大于2(此时的k=2)的最短路径长度。【在框住的内容里,有{a–>c,c–>b}=10,{a–>c,c–>d}=4,{b–>c,c–>d}=6,{d–>c,c–>b}=16,故在D(3)要更新a–>b,a–>d,b–>d,d–>b四条】
在这里插入图片描述这个矩阵说明:中间顶点(此时为a、b和c)的编号不大于3(此时的k=3)的最短路径长度。【在框住的内容里,有{c–>d,d–>a}=7<9,故在D(4)要更新c–>a】
导管这个矩阵说明:中间顶点(此时为a、b、c和d)的编号不大于4(此时的k=4)的最短路径长度。过程结束。

3.伪代码表示

算法:Floyd(W[1..n,1..n])
//实现计算完全最短路径的Floyd算法
//输入:不包含长度为负的回路的图的权重矩阵W
//输出:包含最短路径长度的距离矩阵
D<--W
for k<--1 to n do
	for i<--1 to n do
		for j<--1 to n do
			D[i,j] <-- min{D[i,j],D[i,k]+D[k,j]} 
return D

4.一些语言的代码实现

【待完善】

5.一些扩展

(1)加强Floyd算法,使得该算法能求出最短路径本身,不仅仅是最短路径得长度。
【待完善,似乎是再定义一个矩阵P】

本文是作者在学习数据结构、算法设计与分析课程时,结合自己理解所写的,如有错误或补充,请在评论区留言。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值