The-Design-and-Analysis-of-Algorithms 作业2

1. 问题

用Floyd算法求解下图各个顶点的最短距离。给出距离矩阵(顶点之间的最短距离矩阵)
在这里插入图片描述

对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径。
在这里插入图片描述

2. 解析

Floyd算法:可以方便的求得任意两点的最短路径,称为“多源最短路”。
当任意两点之间不允许经过第三个点时,这些点之间最短路径就是初始路径。假如现在只允许经过1号顶点,求任意两点之间的最短路径,只需判断e[i][1]+e[1][j]是否比e[i][j]要小即可。e[i][j]表示的是从i号顶点到j号顶点之间的路径。e[i][1]+e[1][j]表示的是从i号顶点先到1号顶点,再从1号顶点到j号顶点的路程之和。其中i,j是1~n循环,以此类推。
算法的基本思想是:最开始只允许经过1号顶点进行中转,接下来只允许经过1和2号顶点进行中转……允许经过1~n号所有顶点进行中转,求任意两点之间的最短路程。即从i号顶点到j号顶点只经过前k号点的最短路程。

Dijkstra算法:求指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”。
Dijkstra算法是一种基于贪心策略的算法。每次新扩展一个路程最短的点,更新与其相邻的点的路程。
例题过程如图所示:在这里插入图片描述

3. 设计

Floyd算法
枚举顶点k ∈ [1,n]
以顶点k为中介点,枚举所有顶点对i和j(i ∈ [1,n],j ∈1[1,n])
如果e[i][k] + e[k][j] <e[i][j]成立
赋值e[i][j] = e[i][k] + e[k][j]
运行结果:在这里插入图片描述

Dijkstra算法
找出未标记过的离起点最近的点(如果没有的话,就中止算法)
以该点为中心点更新该点周围的点
重复执行
运行结果:在这里插入图片描述

4. 分析
Floyd算法:T(n) = O(n^3)
Dijkstra算法:T(n) = O(n^2)
5. 源码
https://github.com/LiChunning/The-Design-and-Analysis-of-Algorithms/blob/main/Floyd.cpp
https://github.com/LiChunning/The-Design-and-Analysis-of-Algorithms/blob/main/Dijkstra.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值