一、最短路径
非网图,最短路径是指两顶点之间的边数最少的路线
路径 | 途经路径数 |
A--E | 1 |
A--D--E | 2 |
A--D--C--E | 3 |
A--B--C--E | 3 |
在网图中,最短路径是指两顶点之间,所有经历的“边”上的权值之和最短的路线
路径 | 途经各“边”权重之和 |
A--E | 100 |
A--D--E | 90 |
A--D--C--E | 60 |
A--B--C--E | 70 |
单源点最短路径问题:
有向图 G = <V, E>
V 顶点集 | 图中各顶点的集合(非空集合) |
E 边集 | V中元素构成的有序二元数组的集合 |
问题描述:
给定带权的有向图,G = <V, E>, 对任意顶点Vi,Vj ∈V(i≠j),求顶点Vi到Vj的最短路径。
图信息
用矩阵(或者理解为二维数组去存储原图信息)
解决方法:
方法一:迪杰斯特拉算法(Dijkstra算法)
假设要寻找从顶点1到顶点6的最短路径。
步骤一:(准备工作)
设置一个集合S(用来放置顶点)最开始只有起点,顶点1(源点v)
S的空间大小是所有顶点个数(这个集合如果放满了就代表不论是从源点到任意点的路径都找完了)
S | 1 |
|
|
|
|
|
设置一个用来表示距离的数组dis[],数组的长度是所有顶点个数
步骤二:
初始dis=[0, 1, 12, ∞, ∞, ∞],表示顶点1到其他各个点的距离。
从这个dis[]中找到距离1最小距离的点,是顶点2。
确定最小距离的点是2之后将顶点2放入集合S中。
S | 1 | 2 |
|
|
|
|
步骤三
S中的新顶点是顶点2,2到其他各个顶点的距离,最短的是顶点4。
1 2 3 4 5 6
更新:策略是min(原dis中的各元素,dis中上一以确定的顶点2的值+E[2]的对应值)
dis=[min(0,1+∞), min(1,1+0), min(12,1+9), min(∞,1+3), min(∞,1+∞), min(∞,1+∞)]
将顶点4放入S中
S | 1 | 2 | 4 |
|
|
|
步骤四
S中的新顶点是顶点4,4到其他各个顶点的距离,最短的是顶点3。
1 2 3 4 5 6
更新:策略是min(原dis中的各元素,dis中上一以确定的顶点4的值+E[4]的对应值)
dis=[min(0,4+∞), min(1,4+∞), min(10,4+4), min(4,4+0), min(∞,4+13), min(∞,4+15)]
将顶点3放入S中
S | 1 | 2 | 4 | 3 |
|
|
步骤五
S中的新顶点是顶点3,3到其他各个顶点的距离,最短的是顶点5。
1 2 3 4 5 6
更新:策略是min(原dis中的各元素,dis中上一以确定的顶点3的值+E[3]的对应值)
dis=[min(0,8+∞), min(1,8+∞), min(8,8+0), min(4,8+∞), min(17,8+5), min(19,8+∞)]
将顶点5放入S中
S | 1 | 2 | 4 | 3 | 5 |
|
步骤六
S中的新顶点是顶点5,5到其他各个顶点的距离,最短的是顶点6。
1 2 3 4 5 6
更新:策略是min(原dis中的各元素,dis中上一以确定的顶点5的值+E[5]的对应值)
dis=[min(0,13+∞), min(1,13+∞), min(8,13+∞), min(4,13+∞), min(13,13+0), min(19,13+4)]
将顶点5放入S中
S | 1 | 2 | 4 | 3 | 5 | 6 |
步骤七
S中的元素的顺序代表路径顺序
1—2—4—3—5—6
而最终的顶点1到顶点6的最短距离是17.