最短路径描述
仅讨论单源最短路径问题:从某个源点S∈V到G中其余各顶点的最短路径。对于求多源点的最短路径问题,可以用每个顶点作为源点调用一次单源最短路径问题算法予以解决。
迪杰斯特位(Dijkstra)算法
描述
计算一个顶点到其他所有顶点的最短路径。主要特点是以起始点为中心向外层扩展,直到扩展到终点为止。
思想
数组S记录了当前从源点到该顶点存在最短路径的顶点集合
数组dist(简称D)记录当前状态源点到图中其余各顶点之间的最短路径长度;
数组path(简称P)是最短路径的路径数组,其中path[j]表示从源点到顶点j的最短路径上顶点的前驱顶点。
每一次循环都是从数组D中选择未被加入到数组S中的顶点到源点路径最短的顶点加入到数组S中,然后对数组D和数组P进行修改,直到所有顶点都加到了数组S 中为止。
执行过程:如下图所示:
计算机执行过程模拟;
循环 | 集合S(最短路径的顶点集合) | j | D[1] D[2] D[3] D[4] D[5](记录起点到其他顶点最短路径长度) | P[1]P[2]P[3]P[4]P[5](最短路径上 的直接前驱) |
---|---|---|---|---|
初始化 | {1}起点 | 1 | 0 9 ∞ ∞ 18(比较直连的路径长度哪个短,哪个短就入集合s) | 0 l 0 0 1 |
2 | {1,2} | 2 | 0 9 14 ∞ 18(从刚入s的V2开始找到最短路径长度,只有V3) | 0 1 2 0 1 |
3 | {l,2,3} | 3 | 0 9 14 17 16(从V3开始有V4V5,到v5路径长度要短,所以下一个入集合s的是V5) | 0 l 2 3 3 |
4 | {1,2,3,5} | 5 | 0 9 14 17 16 | 0 1 2 3 3 |
5 | {1,2,3,5,4} | 4 | 0 9 14 17 16 | 0 1 2 3 3 |
真题 2021年4月
图是一个无向图。
源点 | 最短路径 | 终点 | 路径长度 |
---|---|---|---|
a | a,c | c | 10 |
a | a,c,b | b | 12 |
a | a,c,d | d | 13 |
a | a,b,e | e | 22 |
a | a,c,d ,f | f | 21 |
拓扑排序
对一有向图,如果从Vi到Vj存在一条路径,且在由图中所有顶点构成的线性序列中,Vi总在Vj之前,那么这样的线性序列就被称为拓扑序列。构造一个有向图的拓扑序列的过程称为拓扑排序。
有向图转成拓扑条件
① 初始时有向图中必须至少有一个入度为0的顶点。
② 有向图中不存在回路。
满足以上两条的有向图称为AOV网
拓扑排序过程
① 从有向图中选择一个入度为0的顶点;
② 从有向图中将该顶点以及由该顶点发出的所有弧全部删除;
③ 重复上述过程,直到剩余的网中不再存在入度为0的顶点。
如下图所示:
拓扑排序的结果为:C1,C4,C2,C7,C9,C3,C6,C5,C8
拓扑排序算法的时间复杂度为O(n+e)。
4,C2,C7,C9,C3,C6,C5,C8
拓扑排序算法的时间复杂度为O(n+e)。