GRAPH
Michael Tsai 2011/11/25
Biconnected Components相關名詞
• Articulation point:
• 如果在connected graph G中的的一個vertex v被移除以後(包 含v和所有incident在它上面的edge), 新的graph G’會變成有 兩塊以上的connected components
• (複習: 什麼是 connected components)
• Biconnected graph: 沒有articulation point的graph
• Biconnected component: maximal biconnected subgraph
• 這邊maximal是說, 沒有一個可以包含它的subgraph是 biconnected的
例子
1
2 3
0
4
5
7
6
8 9
猜一猜哪邊是articulation point? (有沒有articulation point?) 加了什麼邊可以讓它變成不是articulation point?
1 0
1
2 3
4
3 5
7
8 9
5
7
6 Biconnected components:
7
NTU CC 1G 光纖
cisco 3750
cisco 2960 cisco 2960
215 機房
各樓層研討室
Where is the articulation point(s)?
How do we eliminate them?
PC PC PC
實驗室
1G 網路線
DFS另一用途
• 可以用來尋找articulation point & biconnected components
• 怎麼用呢? 首先先把graph做一次dfs, 並標上discover的順序
• 從哪個vertex開始不重要, edge順序也不重要
• (真的嗎? 自己驗證看看)
1
2 3
0
4
5
7
6
8 9
0
1 2
3 4
5
6 7
8 9
尋找articulation point
•
如果是root的話(開始做dfs 的地方), 且有超過一個的 children 是articulation point
•
如果不是root:
•
當有一個以上的小孩, 無 法沿著它自己的後代及一 條nontree edge (back edge) 到達它的祖先的時候, 則 為articulation point
•
back edge: 一條edge (u,v), u是v的祖先或者v是u的祖 先.
3
4
2
1
0
5
6
7
9 8
0
1
2
3
4
5
6
7
8 9
尋找articulation point
• 定義一些function來找articulation point
• low(u)=min{u.d, min{low(w)|w is a child of u}, min{w.d| (u,w) is a back edge}}
尋找articulation point
• 當某vertex v有任何一個 child的low值>=v.d時, 則v 為articulation point
3
4
2
1
0
5
6
7
9 8
0
1
2
3
4
5
6
7
8 9
0 1 2 3 4 5 6 7 8 9
v.d 4 3 2 0 1 5 6 7 9 8
low 4 0 0 0 0 5 5 5 9 8
low(u)=min{u.d,
min{low(w)|w is a child of u}, min{w.d| (u,w) is a back edge}}
Minimum Cost Spanning Tree
• 電路設計需要把N個電子零件的接點連接在一起
• 這些接點在不同的位置
• 要如何把它們通通連接起來呢? 需要有N-1條”電線”, 每一條 把兩個接點連接起來
• 怎麼樣才能使用最短的電線呢?
• 轉換: G=(V,E) 是undirected graph, V是接點, E所有可能的電 線
• 每一個E (u,v)的weight w(u,v)代表所需使用的電線長度
• 須找出一個acyclic的subset 𝑇 ⊆ 𝐸 連接所有的vertex, 且使 𝑤 𝑇 = 𝑢,𝑣 ∈𝑇 𝑤(𝑢, 𝑣)
Minimum Cost Spanning Tree
• T: acyclic且連接所有vertex, 所以為一棵tree且span到整個 graph, 所以稱為spanning tree.
• 複習: Spanning tree須滿足那些條件?
• 1. 因為是tree, 所以沒有cycle
• 2. 因為是tree, 所以正好有n-1個edge
• 下面介紹三種使用greedy algorithm產生minimum cost spanning tree的方法
一般型Minimum Spanning Tree演算法
GENERIC-MST(G,w)
while A does not form a spanning tree
find an edge (u,v) that is safe for A A=A ⋃* 𝑢, 𝑣 +
return A
•
A是最終的MST的edge的subset
•
隨時A都保持acyclic隨時𝐺
𝐴= (𝑉, 𝐴) 都是一個forest
•
每次都選一個edge, 把 𝐺
𝐴中兩棵tree連接起來 (因為不能出現cycle)
•
最後共選|V|-1條邊
•
下面三個algorithm的前兩個都是用這個方法
•
Reading Assignment: 課本23.1
Kruskal’s algorithm
•
這個方法是我覺得最直觀的方法.
MST-KRUSKAL(G,w) A={}
for each vertex 𝑣 ∈ 𝐺. 𝑉 MAKE-SET(v)
sort G.E by w
for each edge (u,v) ∈ 𝐺. 𝐸
if FIND-SET(u)≠FIND-SET(v) A=A⋃{(u,v)}
UNION(u,v) return A
0
5
1
6
4
3
2 10
25
22 24
12 18
16 14
28 管理set的一些工具function:
MAKE-SET(v): 創造一個set
FIND-SET(v): 找到這個set的頭頭(id) UNION(u,v): 把兩個set合併起來
Kruskal’s algorithm
MST-KRUSKAL(G,w) A={}
for each vertex 𝑣 ∈ 𝐺. 𝑉 MAKE-SET(v)
sort G.E by w
for each edge (u,v) ∈ 𝐺. 𝐸
if FIND-SET(u)≠FIND-SET(v) A=A⋃{(u,v)}
UNION(u,v) return A
𝑂(𝐸 log 𝐸)
𝑂(𝐸)次
𝑂(𝐸)次 𝑉 次
𝑂( 𝑉 + 𝐸 𝛼(𝑉)) 𝐸 ≥ 𝑉 − 1 since G is connected 𝑂(𝐸𝛼 𝑉 ) 𝛼 𝑉 = 𝑂 log 𝑉 = 𝑂(log 𝐸)
𝑂 𝐸 log 𝑉 𝐸 < 𝑉 2, 所以 log 𝐸 = 𝑂(log 𝑉 )
管理set的一些工具function:
MAKE-SET(v), FIND-SET(v), & UNION(u,v) 執行共m個operation的時候(n個item) 則執行時間為𝑂 𝑚𝛼 𝑛
管理set的資料結構相關內容請見課本21章
證明題
• 證明Kruskal’s algorithm會產生出minimum cost spanning tree.
• (1) 證明當某graph有spanning tree的時候, Kruskal’s algorithm會產生出 spanning tree.
• (2) 證明這個產生出來的spanning tree一定是cost最小的.
• 證明(1):
• 什麼時候某graph一定有spanning tree呢?
• 原本是connected的
• Algorithm什麼時候會停下來呢?
• (1) 當T裡面已經有n-1個edge了, 且正好每個edge都處理完畢 (成功, 不管它)
• (2) T裡面還沒有n-1個edge, 但是每個edge都處理完畢, 而有些node沒有連接 到 (我們的algorithm會不會造成這樣的情形呢?)
• 但是我們的程式只會把造成cycle的edge丟掉, 當把造成cycle的edge丟掉的 時候, 不會因此讓某個node在T裡面沒有跟其他vertex connected.
• 所以不會造成(2)的情形
證明題
• 證明(2)
• 假設T是用我們的algorithm做出來的spanning tree
• 假設U是某一個minimum cost spanning tree (可能有很多個, 其中一個)
• 既然都是spanning tree, T和U都有n-1個edge
• 有兩種情形:
• (1) T和U一模一樣, 則T就是minimum cost spanning tree (沒什 麼好證的)
• (2)T和U不一樣. 則我們假設它們有k條edge不一樣, 𝑘 ≥ 0.
證明題
•
每次我們從T取出k條不一樣的edge中其中一條(此edge不在U中), 從cost最小的開始到cost最大的.
•
把這條edge(我們叫它t)加入U的時候, 會產生一個cycle在U中
•
這個cycle裡面, 一定有某一條edge不在T裡面, 我們叫它u (因為T 沒有cycle). 我們把u從U拿掉, 這個新的spanning tree叫做V
•
V的total cost就是 cost(U)-cost(u)+cost(t).
T U
k條不在U中的, 其中最小的為t
t u
V
證明題
• 但是cost(t)不能小於cost(u), 否則V就比U的cost少了 (contradiction)
• cost(t)也不能大於cost(u),
• 不然當初我們做T的時候, 應該會先選到u, 但是因為它會造 成cycle所以才不選它.
• 所以u和所有在T裡面cost跟cost(u)一樣大或者更小的edge會 造成cycle.
• 但是剛剛既然我們先選到t (在T裡面不在U裡面最小的一個), 表示這些cost跟cost(u)一樣大或者更小的edge都在U裡面
• 表示u和這些edge都在U裡面, U會有cycle (contradiction)
證明題
• 搞了半天, 目前可以證明cost(f)=cost(e)
• 所以cost(V)=cost(U)
• 重複以上步驟, 可以最後變成 V=T 且 cost(V)=cost(T)=cost(U)
• 所以T也是minimum cost spanning tree
Prim’s Algorithm
MST-PRIM(G,w,r) for each 𝑢 ∈ 𝐺. 𝑉
u.key=∞
u.pi=NIL r.key=0
Q=G.V
while Q≠{}
u=EXTRACT-MIN(Q)
for each 𝑣 ∈G.Adj[u]
if v∈ 𝑄 and w(u,v)<v.key v.pi=u
v.key=w(u,v) A={(v,v.pi):v∈V-{r}}
0
5
1
6
4
3
2 10
25
22 24
12 18
16 14
28 u.key: 記錄到𝐺𝐴最短的邊的weight
u.pi: 紀錄上面講的那條邊的另外一端是哪個vertex
Sollin’s algorithm
• 一開始每個vertex自己是一個forest
• 保持都是forest
• 每個stage, 每個forest都選擇一個該forest連到其他forest的 edge中cost最小的一個
• 執行到沒有edge可以選了, 或者是變成tree了 0
5
1
6
4
3
2 10
25
22 24
12 18
16 14
28
Shortest paths
• 目標: 找出vertex u到graph G中任何一點的最短距離
0
3
1
4
2
5 45
50 10
20 20 15
15 3
35 30 10
TO VERTEX PATH LENGTH
3 0 3 10
4 0 3 4 25
1 0 3 4 1 45
2 0 2 45
5 No path ∞
Dijkstra’s algorithm
• Set S裡面有一些已經加入的vertex (包括起始點𝑣0)
• w不在S中, 則有distance[w]紀錄從𝑣0經過S中的任意個vertex 後, 最後到達w的這樣形式的最短路徑
w S 𝑣0
Dijkstra’s algorithm
• 每次選擇u, 為distance[u]中最小的
• 選進S以後, 𝑣0到u的shortest path就找到了
• 所以找到shortest path的順序會是由最短的找到最長的
• 把u選進去S以後, 就要把所有u的edge <u,w>都看一遍:
• if distance[w]>distance[u]+cost(<u,w>)
• distance[w]=distance[u]+cost(<u,w>)
小證明
• 如果下一個選擇的vertex為u, 為什麼𝑣0到u的最短path會正 好是前面的vertex都在S中, 只有u不在S中呢?
• 因為假如有path中有vertex w也不在S中, 那麼表示path中會 有一段是𝑣0到w, 而且長度比較短 (因為是sub path)
• 可是這樣的話, 應該w之前應該就要被選過了 (應該要在S中) (contradiction)
• 所以𝑣0到u的最短path前面的vertex都在S中, 只有u不在S中
例子
0
3
1
4
2
5 45
50 10
20 20 15
15 3
35 30 10
selection 0 1 2 3 4 5
Initial 0 50 45 10 ∞ ∞
例子
0
3
1
4
2
5
50 10
20 20 15
15 3
35 30 10
selection 0 1 2 3 4 5
Initial 0 50 45 10 ∞ ∞
3 0 50 45 10 25 ∞
4 0 45 45 10 25 ∞
1 0 45 45 10 25 ∞
2 0 45 45 10 25 ∞
更多動畫例子
• http://www-b2.is.tokushima-
u.ac.jp/~ikeda/suuri/dijkstra/DijkstraApp.shtml?demo1
• Time complexity?
• 答案: 𝑂(|𝑉|2)
• 每次都要看一次distance[], 共n個
Bellman-Ford algorithm
• 另外一種找到shortest path的algorithm
• 可以handle path cost是負的情形
• 為什麼Dijkastra 有問題?
• 如果下一個選擇的vertex為u, 為什麼𝑣0到u的最短path會正 好是前面的vertex都在S中, 只有u不在S中呢?
• 因為假如有path中有vertex w也不在S中, 那麼表示path中會 有一段是𝑣0到w, 而且長度比較短 (因為是sub path)
• 可是這樣的話, 應該w之前應該就要被選過了 (應該要在S中) (contradiction)
• 所以𝑣0到u的最短path前面的vertex都在S中, 只有u不在S中
假設cost可以是負的, 這就不一定 正確了.
Bellman-Ford algorithm
• 定義 𝑑𝑖𝑠𝑡𝑙 𝑢 為從𝑣0到u的最短路徑, 最多經過l條edge
• 一開始𝑑𝑖𝑠𝑡1 𝑢 為cost(<𝑣0,u>) (如果沒有edge則為無限大)
• 由𝑑𝑖𝑠𝑡𝑘−1,-算𝑑𝑖𝑠𝑡𝑘,-
• 最後算到𝑑𝑖𝑠𝑡𝑛−1 𝑢 為最後shortest path解 (因為每個node最 多走一遍, 不然就有cycle了)
Bellman-Ford algorithm
• 由𝑑𝑖𝑠𝑡𝑘−1,-算𝑑𝑖𝑠𝑡𝑘,-
• 怎麼算呢?
• 有以下兩種可能性:
• 如果從𝑣0到u的使用最多k個edge的最短路徑其實使用了k-1 或更少edge的話, 則𝑑𝑖𝑠𝑡𝑘 𝑢 = 𝑑𝑖𝑠𝑡𝑘−1 𝑢
• 如果從𝑣0到u的使用最多k個edge的最短路徑使用了k條edge 的話, 則最短路徑可能為經過別的vertex i的shortest path (用 了最多k-1條edges)後再走edge <i,u>.
• 綜合以上兩條規則:
• 𝑑𝑖𝑠𝑡𝑘 𝑢 = min*𝑑𝑖𝑠𝑡𝑘−1 𝑢 , min
𝑖 𝑑𝑖𝑠𝑡𝑘−1 𝑖 + 𝑐𝑜𝑠𝑡 𝑖, 𝑢 +
例子
0
1
2
3
4
6
5 6
5
5 -2
-2
-1
3
-1 3
k 1 2 3 4 5 6
1 6 5 5 ∞ ∞ ∞
2 3 4 5 6
1
其他例子: http://www.ibiblio.org/links/applets/appindex/graphtheory.html vertex 0到其他vertices的最短路徑:
例子
0 2
3
6
5 6
5
5 -2
-2
3
-1 3
k 1 2 3 4 5 6
1 6 5 5 ∞ ∞ ∞
2 3 3 5 5 4 ∞
3 1 3 5 2 4 7
4 1 3 5 0 4 5
5 1 3 5 0 4 3
6 1 3 5 0 4 3
1
其他例子: http://www.ibiblio.org/links/applets/appindex/graphtheory.html
一些可以思考的東西
• time complexity = ?
• 答案:
• adjacency matrix: 𝑂(|𝑉|3)
• adjacency lists: 𝑂 𝑉 |𝐸|
• 前面都沒有提到怎麼真的輸出path本身經過哪些vertex
• 想想看, 要怎麼做?
答案: 每次 up
dat e d ist an 的時候, 順便 ce
up dat e附在旁邊的 lin
ked list . (用 lin ked list 表示pa
th )
TANET
Routing protocol
• 要計算從某個點到另外一個點 的路徑(route)
• 目標: 連線速度?
• path cost =?
• Dijkstra比較適合還是Bellman- ford比較適合?
答案: 似乎 Be
llm an -Fo 比較適合, 因為不需要知道所有 rd
lin k c 即可建立ro ost
uti ng ta ble