最短路径问题抽象
典型用途:交通网络问题——从甲地到乙地是否有公路连通?在有许多条公路连通的情况下,哪一条最短?
问题抽象: 在有向网中A点(源点)到达B点(终点)的多条路径中,寻找一条各边权值之和最小的路径,即最短路径。
最短路径与最小生成树不同,路径上不一定包含n个顶点,也不一定包含n-1条边。
通常最短路径问题可分为以下两类:
第一类:两点间最短路径
知道源点(v1)和终点(v7),找到一条最短路径(图中蓝色边)。
第二类:某源点到其他各点最短路径
知道源点(v1),求到其他各顶点的最短路径(如表所示)。
两种常用算法:
Dijkstra算法
算法思路:
算法步骤:
例子说明:
1.初始状态如下图,此时,
。
2.从T中找一个距离值最小的结点
加入到S集合中,
,修改距离值。
3.从T中找一个距离值最小的结点
加入到S集合中,
,修改距离值。
4.从T中找一个距离值最小的结点
加入到S集合中,
,修改距离值。
5.从T中找一个距离值最小的结点
加入到S集合中,
,修改距离值。
6.从T中找一个距离值最小的结点
加入到S集合中,
,修改距离值。
6.从T中找一个距离值最小的结点
加入到S集合中,
,修改距离值。此时,S=V,结束。
Floyd算法
算法思想:
算法步骤:
例子说明:
1.初始时,如下图,
2.加入结点A,进行试探,
3.加入结点B,进行试探,
4.加入结点C,进行试探,
5.此时,所有顶点试探完毕,算法结束。