贪心算法之最短路径(Dijkstra算法)
一.题目描述
此处的最短路径为单源最短路径问题
(参考教学:屈婉玲《算法设计》)
给定带权有向网络G=(V,E,W),每条边e=<i,j>的权w(e)为非负数,表示从i到j的距离。求从源点s出发到达其他结点的最短路径。
输入:有向图G=(V,E,W),V={1,2,3...n},s=1
输出:从s到每个顶点的最短路径
二.Dijkstra算法
求单源最短路径问题一般用到Dijkstra算法,Dijkstra算法是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。
Dijkstra算法有关概念
初始:S={s},S=V时算法结束
从s到u相对于S的最短路径:从s到u且经过S中顶点的最短路径
dist[u]:从s到u相对于S最短路径的长度
short[u]:从s到u的最短路径的长度
Dijkstra算法设计思想
输入:有向图G=(V,E,W),V={1,2,3...n},s=1
输出:从s到每个顶点的最短路径
1. 初始化S={1}
2. 对于i属于[V-S],计算1到i相对于S的最短路径,长度dist[i]
3. 选择[V-S]中dist值最小的j,将j加入S,修改V-S中顶点的dist值
4. 继续上述过程,直到S=V为止
三.Dijkstra算法伪代码
算法:Dijkstra
1.S <—— {s}
2.dist[]
3.for i ∊ V - {s} do
4. dist[i] <—— w(s,i) # 若s到i没边,则w(s,i)= ∞
5.while V - S ≠ Ø do
6. 从V-S取相对于S的最短路径顶点j
7. S <—— S ∪ {j}
8. for i ∊ V-S do
9. if dist[j]+w[j,i] < dist[i]
10. then dist[i] <—— dist[j] + w[j,i]
END
往期回顾