图论是离散数学中比较重要的一个分支;而图,恰好又是计算机中最重要的数据结构。所以今天开一个图论专题。
说道图,最先想到也是最常用的,自然就是怎样求最短路径。我们常说的最短路径指的是单源最短路径。常见的解决单源最短路径问题的算法有Dijkstra算法和Bellman-Ford算法。这两种算法都是基于动态规划思想实现的,所以这两个算法都有一个核心操作,就是松弛(Relax)。但是它们适用的范围不太一样。而对于多源最短路径,则有Floyd算法实现。
迪杰斯特拉算法
朴素Dijkstra算法遍历某一结点到其他结点的最短路径,其特点类似于BFS,层层向外扩展,直到找到终点为止。这种方法实现起来十分好理解,但是由于它遍历了大量的结点,导致它的时间复杂度达到了O(V^2+E)。若源点可达,复杂度变成O(V*logV+E*logV)。在稀疏图上,由于E=V*V/logV,时间复杂度可达O(V^2)。我们可以考虑用heap去优化Dijkstra,这样能使得复杂度进一步降低,获得O(VlogV+E)。
贝尔曼-福特算法
Dijkstra算法有个局限性,就是它只能求解单源、正权的最短路径。一旦图上含负权,Dijkstra就无能为力了。原因很好理解,Dijkstra在贪心地寻找当前距源点最小距离的点时,有可能先走过次优点,再走过该负权,会使得最短距离更小。反例很好举,大家随便举一下就可以了。那么含有负权的最短路径怎么解决呢?采用Bellman-Ford算法就可以了。Bellman算法的核心和Dijkstra一样,就是松弛操作。但是Bellman反复用已有的边去更新最短距离,对于当前结点v,一旦发现dis[v]>dis[u]+graph[u][v],就要把dis[v]维护为dis[u]+graph[u][v]。并且Bellman还有一个功能,就是判负环,如果没有负环的话,该算法会

本文介绍了图论中的最短路径问题,探讨了Dijkstra算法、Bellman-Ford算法以及SPFA算法的原理、适用范围和时间复杂度。Dijkstra适用于正权图,而Bellman-Ford能处理负权图并检测负环。SPFA是Bellman-Ford的一种优化,但在稠密图中可能退化。文章还讨论了不同存图方法的影响。
最低0.47元/天 解锁文章
621

被折叠的 条评论
为什么被折叠?



