山东大学算法分析与设计重点
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
– for any (u,v)E, the in-degree of v can not be zero before deleting u, which implies u appears in front of v.
Dijkstra’s Algorithm
Problem solved Correctness Time complexity Similarities to BFS and PRIM
22.4-5
Note: 首先要计算每个点的入度。O(V+E) 当删一个点时,其邻接点的入度要减1。 O(V+E) 记录入度为0的点.
22.4-5 Proof of Correctness
Induction on |V|. |V|=2, only one edge, trivial. Suppose it is true for |V|<n. When |V|=n. Select a vertex s of in-degree zero.(must exist. Otherwise, all vertices have non-zero in-degrees. Start from a vertex and backtrack along in-edges. Since V is limited, the procedure must end at an in-edge which leaves a vertex already encountered, thus implies a cycle ). According to our algorithm, s will be at the most left of the list L. And the other part L’ of the list is exactly the list of the graph G’ obtained by deleting s and the edges leaving it. By induction hypothesis, all edges in G’ pointing from left to right in the list L’(thus also in L). Considering that all edges in G are either those in G’ or those leaving s, we completes the proof.
Exercises
22.3-2 22.3-6(DFS栈实现)
DFS(G) 1 for each vertex uV[G] 2 do color[u] WHITE 3 [u] NIL 4 time 0 5 Stack S 6 for each vertex uV[G] 7 do if color[u] = WHITE 8 Then S.push(u) 9 While S 10 do color[S.top] GRAY 11 d[S.top] time time +1 12 if exists v Adj[S.top] && color[v] = WHITE 13 then [v] S.top 14 S.push(v) 15 else 16 u S.pop() 17 color[u] BLACK 18 f[u] time time + 1
23.1-5
证明:设C=v0, v1,…,vk是一个圈,其中边e=(v0, vk)是权值最重的边。 只需要构造一棵不包含e=(v0, vk)的MST即可。 设T是一棵包含e=(v0, vk)的MST,则删除e会 使T变成两个连通分支V1,V2,v0V1,vkV2 。依次检测顶点v1,…,vk,找到第一个在V2中 的顶点vi(这样的vi一定能找到,因为vkV2), 从而e’=(vi-1, vi)是穿过割(V1,V2)的一条边,并 且w (v0, vk) w(vi-1, vi)。则T’=T-e+e’是一棵新 的MST。
The Algorithm
1. Topologically sort all vertices in G. Assuming that the vertices are v1, v2, …, vi, …, vj, …, vn in their topological order, where s = vi, t = vj. 2. Initialize p[v] 0, v1 v vn. 3. p[vj] 1. 4. For k j-1 down to i 5. for each v Adj[vk] do 6. if v vj according to their topological order 7. then p[vk] p[vk] + p[v]. 8. return p[vi].
The Dijkstra Algorithm
DIJKSTRA(G,w,s) 1. Initialize-Single-Source(G,s) 2. S 3. QV[G] 4. while Q 5. do uEXTRACT-MIN(Q) 6. SS{u} 7. for each v Adj[u] 8. do RElAX(u,v,w)
23-4(c)
证明:算法实际上是在图G中删除一些圈上权值最重的边,最后得到一 棵MST。 设删除的边依次为e1, e2…,em-n+1,剩余的图依次是G0, G1,…,Gm-n+1,其中 G=G0,Gm-n+1=T,m=|E|,n=|V|。 我们证明Gi+1的MST同时也是Gi的MST即可。 前面23.1-5已经证明了存在Gi+1的MST T’同时也是Gi的MST,而Gi+1的所 有MST的大小与T’一样的,所有它们都与Gi的MST的大小一样,所以他 们都是Gi的MST。 从而Gm-n+1必然是Gm-n,…, Go的MST。
22.3.12
Singly Connected: for all vertices u,vV, if uv, then there is at most one simple path from u to v. idea:
DFS-VISIT(u) 可以发现u可达的所有顶点,即u到这些 点都有路径。 前向边和交叉边(搜索过程中遇到黑点)意味着什 么呢?u到某个点有多于1条路径。 这只是u到其它点的情况,单连通要分析任意的顶 点对,所以需要分析每个点到其它所有点的情况。 即从每个点开始,都做一次DFS-VISIT() 。
n
o r u v
p
q
t
s
w z
y
n
q
4 p
3 o
Fra Baidu bibliotek
1 s
1 r
0 u
0 t
1 y
1 v
w
z
There are 4 distinct paths from p to v.
Another example
b
a
e d
g
h j
k
m l 2 1+1 1 i j k
c
16 8 a b
f
i 4 2+2 2 f g h
8 4+4 4 c d e
1 1 l m
There are 16 distinct paths from a to m.
Another example
b
a
e d
g
h j
k
m l 2 1+1 1 i j k
c
16 8 a b
f
i 4 2+2 2 f g h
8 4+4 4 c d e
1 1 l m
There are 16 distinct paths from a to m.
Dijkstra’s Algorithm Operation
S is now { s, x, y, u }
Pre-decessors show shortest paths sub-graph
Correctness of Dijkstra’s
Theorem 24.6
Dijkstra’s algorithm, run on a weighted,directed graph G=(V, E), with non-negative weight function w and source s, terminates with d[u]= d(s,u) for all vertices uV. Proof (by contradiction)
23-4(a)
证明: 设T中的边按照权值非递减顺序依次为e1, e2,…, en-1, 即算法依次保留边e1, e2,…, en-1。设边集Ai ={ e1, e2,…, ei},1in-1则只需要证明每个Ai 都是某棵最小生成树的子集。 用归纳法证明。 i=1时,设T’是一棵最小生成树,如果(u, v)=e1T’, 结论自然成立。如果e1T’,则在T’ 中存在u到v的路径p。因为删除e1会使图不连通,即删除e1会使顶点集合V划分为两个子 集V1和V2,其中uV1,vV2。则路径p中存在1条边(x, y)满足xV1,yV2,并且(x, y) 已经被删除了,否则如果p中所有边都没被删除,删除e1不会使图不连通。既然(x, y)已 经被删除了,根据算法是按照权值由大到小的顺序删边的,所以w(x, y) w(u, v)。则 T’’=T’ - (x, y)+(u, v)必然是一棵最小生成树。
Problem Solved by Dijkstra’s
Single-source shortest-paths problem Edge weight >=0
Input: A graph G=(V, E) and a source s, and a nonnegative function w: ER+ Output: For each vertex v, shortest path weight d(s,v), and a shortest path if exists.
22.3.12
Singly Connected: for all vertices u,vV, if uv, then there is at most one simple path from u to v. idea:
DFS-VISIT(u) 可以发现u可达的所有顶点,即u到这些 点都有路径。 前向边和交叉边(搜索过程中遇到黑点)意味着什 么呢?u到某个点有多于1条路径。 这只是u到其它点的情况,单连通要分析任意的顶 点对,所以需要分析每个点到其它所有点的情况。 即从每个点开始,都做一次DFS-VISIT() 。
Continued
设对边集Ai时结论成立,现在证明边集Ai+1也是某棵最小生成树 的子集。 设Ai ={ e1, e2,…, ei}是最小生成树T’的子集,如果(u, v)=ei+1T’, 结论自然成立。如果ei+1T’,则在T’中存在u到v的路径p。因为 删除ei+1会使图不连通,即删除e1会使顶点集合V划分为两个子集 V1和V2,其中uV1,vV2。则路径p中存在1条边(x, y)满足xV1 ,yV2,并且(x, y)已经被删除了,否则如果p中所有边都没被删 除,删除e1不会使图不连通。既然(x, y)已经被删除了,根据算法 是按照权值由大到小的顺序删边的,所以w(x, y) w(u, v)。则 T’’=T’ - (x, y)+(u, v)必然是一棵最小生成树。现在只需要证明T’’ 包含Ai ={ e1, e2,…, ei+1}中的所有边,因为T’’与T’只有1条边不同 ,所以只需要证明(x,y)Ai,这显然是成立的,因为(x, y)已经被 删除了,而{ e1, e2,…, ei}是没被删除的。 证明完毕!
22.4-3
Given an algorithm that determines whether or not a given undirected graph G=(V,E) contains a cycle. O(V), independent of |E|. DFS, stops whenever encounters an back edge.