CS170 Efficient Algorithms and Intractable Problems Section3
课程主页:
https://inst.eecs.berkeley.edu/~cs170/fa18/
课程视频:
https://www.bilibili.com/video/BV1wK411g7ck
这次回顾Section 3。
1. Breadth-First Search
各层的情况
A
B D
C E
F
Q的状态变化:
[A]
[B, D]
[D, C, E]
[C, E]
[E, F]
[F]
[]
2. Dijkstra’s Algorithm Fails on Negative Edges
情形1:
A
B C
A <-> B : 3.5
A <-> C : 3
B <-> C : -1
起点为$A$,则结果为
- dist(A) = 0
- dist(B) = 3.5
- dist(C) = 3
但是正确结果为
- dist(A) = 0
- dist(B) = 2($A\to B \to C$)
- dist(C) = 2.5($A\to C \to B$)
情形2:
D C
A B
A <-> B : 100
A <-> D : 100
B <-> C : -1
D <-> C : -1
起点为$A$,则结果为
- dist(A) = 0
- dist(B) = 100
- dist(C) = 99
- dist(D) = 100
显然该情形结果正确。
3. Fixing Dijsktra’s Algorithm with Negative Weights
A
B C
A <-> B : 3.5
A <-> C : 3
B <-> C : -1
所有边都加上100变成:
A
B C
A <-> B : 103.5
A <-> C : 103
B <-> C : 99
起点为$A$,则最短路径为:
- $A\to B$
- $A\to C$
结果为
- dist(A) = 0
- dist(B) = 2.5
- dist(C) = 3
但是正确结果为
- dist(A) = 0
- dist(B) = 2($A\to B \to C$)
- dist(C) = 2.5($A\to C \to B$)
4. Bellman-Ford Practice
(a)
0 | 1 | 3 | 4 | 5 | 6 | 7 | |
---|---|---|---|---|---|---|---|
$A$ | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
$B$ | $\infty$ | 1 | 1 | 1 | 1 | 1 | 1 |
$C$ | $\infty$ | $\infty$ | 9 | 9 | 9 | 0 | 0 |
$D$ | $\infty$ | 8 | 8 | 8 | -1 | -1 | -1 |
$E$ | $\infty$ | 0 | 0 | 0 | -1 | -1 | -1 |
$F$ | $\infty$ | $\infty$ | $\infty$ | $\infty$ | 1 | 1 | 1 |
$G$ | $\infty$ | $\infty$ | -4 | -4 | -4 | -4 | -4 |
$H$ | $\infty$ | $\infty$ | $\infty$ | -3 | -3 | -3 | -3 |
$I$ | $\infty$ | $\infty$ | $\infty$ | $\infty$ | $\infty$ | $\infty$ | $\infty$ |
(b)
$A\to B\to G \to H \to A$为负环。
检测方法为在进行$|V|-1$轮循环后再运行一轮循环,如果某个节点dist减少了,则说明存在负环。
该方法成立是因为,如果存在最短路路径,那么路径上的节点数量必然小于等于$|V|$。
(c)
当且仅当从源点到其他顶点的最短路径唯一。
5. Midterm Prep: Graph Short Answer
(a)
运行DFS。
(b)
时间复杂度为$O(|V|+|E|)$。
(c)
700。
(d)
不正确。
(e)
A B
C D
- $A\to B$
- $A\to C$
- $C\to D$
- $D\to B$
拓扑排序:
- $A,C, D, B$
从源点$A$开始运行,那么结果为
- dist(A) = 0
- dist(B) = 1
- dist(C) = 1
- dist(D) = 2
因此$B$在$D$前面,这就和拓扑排序不符。
(f)
时间复杂度为
6. Midterm Prep: Dijkstra Tiebreaking
增加变量cnt[n]即可,源点的值初始化为$0$,其余节点的值初始化为$\infty$,然后增加如下判断:
- if dist(v) = dist(u) + l(u, v):
- if cnt[v] < cnt[u] + 1:
- prev(v) = u
- cnt[v] = cnt[u] + 1
- if cnt[v] < cnt[u] + 1:
7. Midterm Prep: Divide-and-Conquer
记输入为$n$时的输出行数为$T(n)$,那么
这里$n=2^k, k=\log_2 n,k\in \mathbb Z^{+}$,那么
记
那么
两边同除$3^k$可得
注意
将$k=\log_2 n$代入可得
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Doraemonzzz!
评论
ValineLivere