最短路(一) 单起点
在一个图中,给定起点,求到别的点的最短路。
Dijkstra
创建一个距离数组,记录当前起点到该点的最短距离,起点距离初始化为0,其余点初始化为正无穷。
创建最小堆pq,用来存放当前已经找到最小距离的点,初始化为起点,比较原则是根据当前的最小距离。
当堆内仍有元素为处理完时:
- 取出当前距离最小的未访问的点
- 更新它的neighbor的通过该点的距离(如果比原来记录的小的话)并将其加入堆中
正确性:假设当前距离最小的点 V V V对应的距离 S S S并不是它的最小距离,也就是有另一条路径 p = ( v 1 , v 2 , . . . , v m , V ) p=(v_{1}, v_{2}, ..., v_{m}, V) p=(v1,v2,...,vm,V)使得路径最短,那么从起点到p中任意点的路径都比 S S S要小,根据算法 v 1 , v 2 , . . . , v m v_{1}, v_{2}, ..., v_{m} v1,v2,...,vm都应该在 V V V之前就被访问了,在访问 v m v_{m} vm时, V V V作为它的邻点,距离已经被更新成p的长度,又因为 p < S p \lt S p<S,所以根据算法一定有该最小距离比 S S S先被访问到,矛盾。
例子
代码
// 图用邻接链表表示,Pair中第一个数为另一端点,第二个数为权重
public static int[] dijkstraAlgo(List<List<Pair<Integer, Integer>>> graph, int start) {
List<Integer> seq = new ArrayList<>();
int[] distance = new int[graph.size()];
int[] visited = new int[graph.size()];
Arrays.fill(distance, Integer.MAX_VALUE);
distance