绪论
前几章节我们介绍了图中的一系列知识点——基础术语(有向,无向,边,顶点,度)和存储方式(邻接矩阵,邻接表),遍历结点的方式(宽度优先遍历和深度优先遍历),拓扑排序(我个人觉得应该将拓扑排序看作图遍历的一种方法)。
这一章节我们讨论结点之间不同要求,不同情况下求最优路径的方式。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路径长度的重复计算。
这样我们就能够大概想到从整体来计算某节点到其他结点最短路径的策略框架:每次确定一个(或多个)结点的最短路径,然后通过