最短路入门(Dijkstra、Floyd)
1 最短路问题是什么?
最短路问题(Shortest Path Problem, SPP
)是图论中的一个经典问题,旨在找到图中两点之间的最短路径。这个问题在计算机科学、运筹学以及网络设计等领域有着广泛的应用。
1.1 定义
给定一个图 G = (V,E),其中 V 是顶点集合,E 是边集合,每条边都有一个相应的权重 w (e∈E)。最短路问题就是要找到图中两个顶点 u 和 v 之间的最短路径,即权重之和最小的路径。
1.2 分类
最短路问题可以分为两大类:
-
无向图的最短路问题:在这种情况下,图中每条边都没有方向,w(e) 通常表示边 e 的长度或成本。
-
有向图的最短路问题:在有向图中,边具有方向,从一个顶点指向另一个顶点,此时 w(e) 可能表示沿边 e 行驶的距离或时间等。
2 最短路问题怎么做?
由于无向图的最短路操作可通过转换有向图的最短路操作得到,所以我们在这里只谈论有向图的最短路操作。(其实是本蒟蒻太菜了 [哭])
2.1 单源最短路(Dijkstra)
2.1.1 是什么?
单源最短路径(Single-Source Shortest Path)问题是指在一个加权图中,找出从单一源点(起始点)到图中所有其他顶点(目标点)的最短路径。这里的“最短”通常指的是路径的总权重最小,即经过的边数最少或者所花费的时间最短,取决于图的加权方式。
2.1.2 Dijkstra
定义:
Dijkstra算法是一种具有贪心、dp
思想的算法,主要用于解决加权图中从单一源顶点到所有其他顶点的最短路径问题。
它通过不断地选择未访问顶点中距离最小的顶点,并更新其所有邻接点的最短路径长度,直至找到所有顶点的最短路径。
该算法保证了得到的最优解,时间复杂度为O(V^2)
【其中V是顶点的数量;这是因为对于每个顶点,我们需要遍历整个顶点集合来找到下一个最短路径候选顶点】;但如果使用优先队列可以优化到O(E + V*logV)
【其中E是边的数量;这是因为对于每个顶点,我们可能需要处理最多E条边,每处理一条边,我们可能会在优先队列中进行VlogV
次的操作(因为每个顶点最多被弹出VlogV
次)】。
实现:
步骤(文字描述):
-
初始化:首先,给图中的所有顶点赋一个初始距离值,通常将起点设置为0,其他所有的顶点的