最短路问题
一、概念:
在图论中最短路径有着非常广泛的应用,而由于应用的方法不同也形成了多种求最短路径的方法,而对于不同类的问题虽然每种方法都可以用,不过各有其最优的实现方法。
首先对于最短路径问题,可以分成如下几类:
1. 求单源最短路径问题:这种问题是最短路径问题中最基本的问题了,其主要目的是求从一个固定源点开始到每一个点的最短路径;对于这个问题,所有的方法都适用;
2. 求单汇最短路径问题:这种问题的目标是求所有的点到某个确定汇点的最短路径,不难想到,对于求所有点到某个点的最短路径,就相当于求从这个点出发到其余点的最短路径,不过需要对每条边进行“反向”操作(类似于将竖直上抛运动转化为自由落体运动一样),这样同理于单源最短路问题,所有的方法都适用;
3. 求一个确定源点到一个确定汇点的最短路径问题:这个问题其实非常简单,通过分析不难发现,解决这个问题的最好方法其实还是和单源最短路一模一样的,到现在为止尚未发现比应用求单源最短路方法更好的解决这个问题的方法;
4. 求每对源汇点间最短路径问题:这个问题首先可以简化为从每个节点开始求一遍单源最短路,然后慢慢统计即可。不过这个方法的复杂度比较大,这样子就衍生出了一种特殊的方法来求解这个问题,不过在时间复杂度上要落后于多次单源最短路,这点是比较重要的。
综上所述,其实在最短路径问题中,最重要的其实就是如何求解单源最短路问题。
二、算法:
对于单源最短路问题,我们有两种最基本的方法:Dijkstra和Bellman-Ford,这两种方法可以说是从基本思想上就有差别,而在这两种方法的基础上又衍生出了一些更优秀的算法。
首先声明,在最短路径中绝对不能包含负权环,因为如果存在负权环的话总能在现有的最短路径中找出一个更优的。
1. Dijkstra算法:
这个算法利用了贪心的思想,每次取出一个当前最短路长度最小的一个节点,然后以此节点为中心对和它相连的所有点进行一遍松弛操作,直到将所有的点做完为止。
可以看出这种方法在松弛操作部分是相当迅捷的,而算法也十分简单,这个基本算法的缺点主要是体现在