0%

Lec17 最短路径算法:Dijkstra算法,广度优先搜索

MIT算法导论课程:Lec17 最短路径算法:Dijkstra算法,广度优先搜索 ,对应书上的章节:Section 22.2

1. Properties of shortest paths

Paths in graphs

考虑一个带权重边的图,路径的权重为\(w(p)=\sum_{i=1}^{k-1}w(v_i,v{i+1})\).

从u到v的最短路径为:\(\delta(u,v)=min\{w(p:p\ is\ a\ path\ from\ u\ to \ v)\}\)

如果uv不存在路径则\(\delta(u,v)=+\infty\).

如果边的权重可以为负数,那么最短路径可能不存在,因为可能有一个负数的环。

Optimal substructure

Theorem: 最短路径的子路径也是最短路径。

Proof: Cut and Paste.

Triangle inequality

Theorem: 对于所有的\(u,v,x,\in V\),有:\(\delta(u,v)\leq \delta(u,x)+\delta(x,v)\).

Single-source shortest paths

假设边的权重都是非负的,所有的最短路径都是存在的。

IDEA:贪心(Greedy).

  1. 维护一个从s到该集合S的点的最短路径已知的集合。

  2. 每一步从\(v\in V-S\)中添加一个估计距离s最短点到S中。

  3. 更新到v的距离。

2. Dijkstra’s algorithm

算法:

松弛操作部分可以理解为对三角不等式的约束进行不断松弛的操作,使之满足,再松弛过程中实现了降序排列Key的操作。

3. Correctness

Part 1

Lemma:初始化\(d[s]=0,其他的点d[v]=+\infty\),在整个过程中对于所有\(v\in V,d[v]\geq \delta(s,v)\)

proof: 反证法,假设v是第一个\(d[v]<\delta(s,v)\)的点,u是导致改变的点\(d[v]=d[u]+w(u,v)\)。所以有一下矛盾。

Part 2

Lemma:uv最短路径的前一节点,如果\(d[u]=\delta(s,u)\),并且边\((u,v)\)是已经松弛了的,则我们有通过松弛后\(d[v]=\delta(s,v)\)

proof:松弛过程实现

Part 3

Lemma:Dijkstra 算法最后会计算出所有的\(d[v]=\delta(s,v)\).

Proof:v 添加到S中时可以保证\(d[v]=\delta(s,v)\),通过反证法证明。假设u时第一个添加到S中去\(d[u]>\delta(s,u)\)的。假设y是第一个u的最短路径中的S-V中的节点。当x添加时,\(d[x]=\delta(s,x)\),边(x,y)是松弛过的,\(d[y]=\delta(s,y)\leq\delta(s,u)<d[u]\)。但是\(d[u]\leq d[y]\),矛盾了。

4. Analysis

假设对于所有的边\(w(u,v)=1\) ,采用FIFO队列代替优先队列。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道