Lecture 21

本文介绍了图论中求最短路径的算法,包括BFS、Dijkstra和Bellman-Ford算法。Dijkstra适用于非负权图,而Bellman-Ford能处理负权图。通过算法思想分析,揭示了Dijkstra算法如何从基础方法演变为更高效的选择。
摘要由CSDN通过智能技术生成

绪论

前几章节我们介绍了图中的一系列知识点——基础术语(有向,无向,边,顶点,度)和存储方式(邻接矩阵,邻接表),遍历结点的方式(宽度优先遍历和深度优先遍历),拓扑排序(我个人觉得应该将拓扑排序看作图遍历的一种方法)。

这一章节我们讨论结点之间不同要求,不同情况下求最优路径的方式。BFS作为一种求单源结点到单源结点最短路径的方式,在其他情况求解最优路径的表现并不适用,同时对于求解单源结点到单源结点最短路径,也有在BFS的基础上优化的更好的算法。


Shortest Path

这里讨论的最优路径都是最短路径,两个节点的最短路径就是指两个节点之间的多条路径中路径权重最小的一条路径(这里将无权图的看作每条路径权重相等的有权图)。

例如下图中寻找结点1到结点13的最短路径。

在这里插入图片描述
在这里插入图片描述


Applications

寻找最短(优)路径在现实生活中的应用非常之多,直接应用就是地图软件的路径规划和计算机网络中的信息传输。

在这里插入图片描述
在这里插入图片描述


Bellman-Ford algorithm

求解图上最短路问题的算法适用于不同情形的主要有以下几种:

在这里插入图片描述

这一章节先介绍迪杰斯特拉算法和贝尔曼福特算法。

这两种算法针对的是寻找单个节点到其他所有节点的最短路径,’从算法思想上看可以看作现实生活中寻找结点到各个结点最短路径直接想法的数学算法体现。

(我本来打算按照课件上的顺序介绍,但是在思考两种算法的时候发现了一些有趣的事,所以擅自调整了介绍的顺序)

我们按照顺序思考下面几个问题:

1.寻找单个结点到各个结点的最短路径,单个结点到单个结点独立计算最短路径的算法是否适用?

这个问题的答案在我们没有找到结点到结点最短路径的关系之前并不是显然的,因为如果结点到结点的最短路径之间是完全互相独立的,那么我们会很抱歉地发现:即使再整体地去考虑整个问题,最终都避免不了独立计算结点到单个节点地最短路径。

BFS,UCS就可以做到独立计算结点到单个节点的最短路径。

不过我们稍作推理就能够发现,结点到结点的最短路径并不是完全互相独立的,例如下图中我们求解结点A到其余结点的最短路径,结点A到结点C的最短路径和结点A到结点F的最短路径的一部分是重合的,在我们求解A到C的最短路径之前,我们希望能够先求解出A到F的最短路径,且在计算结点A到结点C的最短//路径时能够避免尽可能避免掉结点A到结点F路径长度的重复计算。

在这里插入图片描述

这样我们就能够大概想到从整体来计算某节点到其他结点最短路径的策略框架:每次确定一个(或多个)结点的最短路径,然后通过已经确定最短路径的结点向未确定最短路径的结点进行扩展,未确定最短路径的结点继承已确定最短路径结点的最短路径(来避免重复计算)。

为了方便计算,我们认为起始结点到起始结点的最短路径在算法进行最开始时就确定且长度为0。

2.我们在什么条件能够确定一个结点当前通过继承得到的路径已经是最短路径?

因为仅仅是继承前继结点的最短路径并不能保证我们当前结点得到的路径是最短路径,上面继承得到结点A到结点C最短路径的方法在不同路径长度的相同结构图中都不存在普遍性。如果结点A到结点C的路径长度为8,那么结点A到结点F的最短路径仍为A->B->F,但是结点A到结点C的最短路径变为A->C,继承得到的路径A->B->F->C并不是A到C的最短路径。

最简单(最简单但并不是复杂度最低)确认一个结点当前通过继承得到的路径已经是最短路径的方法是保证该节点的前继结点的最短路径确定,于是可以得到下面的递推表达式。

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值