graph 1
DESCRIPTION
連載 : 學生上課睡覺姿勢大全. http://www.wretch.cc/blog/chi771027/26489957. Graph 1. Michael Tsai 2012/4/24. Königsberg Seven Bridge Problem. 西元 1736 年 , Euler 嘗試著要解答 這個問題 : 右邊 地圖 中 , 有沒有可能找出一條 路徑 , 使得每一條橋都走過一次之後 又回到出發點 ?. 答案 : Graph 必須要是 connected & 必須有 0 個或 2 個 node 有 odd degree. A graph. - PowerPoint PPT PresentationTRANSCRIPT
GRAPH 1Michael Tsai2012/4/24
連載 : 學生上課睡覺姿勢大全http://www.wretch.cc/blog/chi771027/26489957
2
Königsberg Seven Bridge Problem
• 西元 1736 年 , Euler 嘗試著要解答這個問題 :
• 右邊地圖中 , 有沒有可能找出一條路徑 , 使得每一條橋都走過一次之後又回到出發點 ?
答案: Graph必須要是connected & 必須有0個或2個node有odd degree
3
A graph• G: a graph, consists of two sets, V and E.• V: a finite, nonempty set of vertices.• E: a set of pairs of vertices.
• G=(V,E)• V={0,1,2,3}• E={(0,1),(0,2),(0,3),(1,2),(1,3),(2,3)}
0
3
1 2
4
Directed & undirected graph• Graph 中 , edge 有方向的叫做 directed graph, 沒方向
的叫做 undirected graph• Directed graph 通常又叫 digraph• Undirected graph 通常就只叫做 graph
• (1,2) 和 (2,1) 在 undirected graph 是一樣的 edge• <1,2> 和 <2,1> 在 digraph 是不一樣的 edge• V={0,1,2,3}• E=?• E={<0,1>,<0,2>,<1,2>,<2,1>,<3,1>,<3,2>}
0
3
1 2
註 : 課本裡面 digraph 也使用 () 小括號 , 不過我比較喜歡用 <> 角括號來表示 digraph 的 edge, 覺得這樣比較清楚 .
5
Self Edge & Multigraph
0
3
1 2
0
3
1 2
Graph with self-edges<v,v>
Multigraph
6
Maximum number of edges• 一個有 n vertices 的 graph, 最多有幾個 edges?• 一個有 n vertices 的 digraph, 最多有幾個 edges?
• 答案 : graph: , • digraph:
7
怎麼這麼多名詞 XD• 相鄰 (adjacent):
如果有 edge (u,v), 那麼 u, v 兩 vertices 就是 adjacent.
• 如果有 edge <u,v> 那麼我們說 v is adjacent to u.
( 有些課本用相反的定義 T_T)
• 作用 (incident): 如果有 edge (u,v) 那麼 u, v 兩 vertices 就是incident ( 作用 ) on ( 在 ) u 和 v 上面
• <u,v> is incident from u and is incident to v.• <u,v> leaves u and enters v.
• Subgraph: 如果 G=(V,E), G’=(V’,E’) 是 G 的 subgraph, 則且
0
3
1 2
8
Degree of vertex• Vertex 的 degree:• 有幾個 edge 連在 vertex 上
• Digraph 中• 又可分為 in-degree and out-degree• in-degree: 進入 vertex 的 edge 數• out-degree: 出去 vertex 的 edge 數• degree=in-degree+out-degree
• 一個 degree=0 的 vertex 可稱為 isolated
• Edge 數和 degree 的關係 :
1 2 3
4 5 6
𝑒=(∑𝑖=0
𝑛−1
𝑑𝑖)2
9
路徑 (path)• Path: 一條從 u 到 v 的 path, 是一連串的 vertices, , 而且都是
edge.
(digraph 的定義自行類推 )• 如果有一條 path p 從 u 到 u’, 則我們說 u’ is reachable
from u via p.
• Path 的 length: 裡面有幾條 edge
• Simple path: 除了 u, v( 起點和終點 ) 以外 , 其他的 vertices 都沒有重複過 .
• Cycle: 一個 u 和 v 一樣的 simple path• Subpath:??• 答案 : 定義 path 的 vertex sequence 裡面的連續的一段 .
0
3
1 2
10
有連接的 (connected)• In undirected graph:• Vertices u and v are said to be connected iff• there is a path from u to v. (graph & digraph)
• Connected graph:• iff every pair of distinct vertices u and v in V(G) is connected
• Connected component ( 也有人直接叫 component):• A maximal connected subgraph
• Maximal: no other subgraph in G is both connected and contains the component.
• 問 : Tree 是一個怎麼樣的 graph?• 答 : connected and acyclic ( 沒有 cycle) graph
• 問 : Forest 是一個怎麼樣的 graph?• 答 : acyclic graph
0
3
1 2
5
4
3
1 2
5
4
半獸人
11
強連接 (strongly connected)• In digraph:
• Strongly connected:• G is strongly connected iff• for every pair of distinct vertices u and v in V• there is a directed path from u to v and also a directed path from v to u.
• Strongly connected component:• A maximal subgraph which is strongly connected.
1 2 3
4 5 6
強獸人
12
要怎麼表示一個 graph 呢 ?• 主流表示法 :• Adjacency matrix ( 用 array)• Adjacency lists ( 用 linked list)
• 兩者都可以表示 directed & undirected graph
13
表示法 I 用 Array• 本方法叫做 adjacency matrix• index 當作 vertex 號碼• edge 用 matrix 的值來表示 :• 如果有 (i,j) 這條 edge, 則 a[i][j]=1, a[j][i]=1. (graph)• 如果有 <i,j> 這條 edge, 則 a[i][j]=1. (digraph)• 對 undirected graph, ( 也就是對對角線對稱 )
• 請同學解釋要怎麼建 adjacency matrix
• 粉簡單 . 那麼來看看好不好用 :• 如果要看總共有多少條 edge? O(??)• 答 : • 有沒有可能跟 edge 數 (e) 成正比呢 ? • 通常 所以 adjacency matrix 裡面很空
1 2 3
4 5 6
14
表示法 II 用 linked list• 本方法叫做 adjacency lists• 建立一個 list array a[n] (n 為 vertex 數目 )• 每個 list 裡面紀錄通往別的 vertex 的 edge• 問 : 怎麼算 in-degree?
• 答 : 如果要比較容易的話 , 要另外建” inverse adjacency lists”• 請同學告訴我怎麼畫
0 1 2
3 4 5[0]
[1]
[2]
[3]
[4]
[5]
1
3 4
2
0 4
3
15
Weighted Edge• Edge 可以有” weight”• 表示長度 , 或者是需要花費• 一個 edge 有 weight 的 graph• 又叫做 network
• 想想看 : 用剛剛的 representation 要怎麼儲存 weight?• 答 : • adjacency matrix 可以用 array 的值來存• adjacency list 可以在 list node 裡面多開一個欄位存
0 1 2
3 4 5
3
4 2
1
23 5
16
兩者比較• Adjacency lists: • 用來表示 sparse graphs 時使用比較少空間• 使用空間 :
• Adjacency matrix: • 要找某個 edge (u,v) 有沒有在 graph 裡面比較快• 一個 entry 只需要 1 bit (unweighted graph)• 簡單容易 , graph 小的時候用 adjacency matrix 比較方
便• 使用空間 :
17
Breadth-First Search (BFS)• 給一個 graph G=(V,E) 及一個 source vertex s• 找出所有從 s reachable 的 vertices• 計算從 s 到每一個 reachable 的 vertex 的最少 edge 數
目• 產生 breadth-first tree, s 為 root, 而其他 reachable 的vertices 都在樹裡面• Directed graph & undirected graph 皆可
• 此方法會先找到所有距離 s distance 為 k 的 vertex, 然後再繼續找距離為 k+1 的 vertex
18
BFS Pseudo-codeBFS(G,s)for each vertex
u.color=WHITEu.d=u.pi=NIL
s.color=GRAYs.d=0s.pi=NILQ={}ENQUEUE(Q,s)while Q!={}
u=DEQUEUE(Q)for each G.Adj[u]
if v.color==WHITEv.color=GRAYv.d=u.d+1v.pi=uENQUEUE(Q,v)
u.color=BLACK
v.color: 用顏色來區別 discover的狀況 WHITE: 還沒 discovered GRAY: discovered 了 , 但是和該 vertex 相連的鄰居還沒有都 discovered BLACK: discovered 了且和該vertex 相連的鄰居都已discovered
v.d: 和 root 的距離
v.pi: 祖先 (predecessor)
初始所有 vertex 的值
初始開始 search 的 vertex s 的值
對每一個和 u 相連 vertex
19
20
21
BFS Pseudo-codeBFS(G,s)for each vertex
u.color=WHITEu.d=u.pi=NIL
s.color=GRAYs.d=0s.pi=NILQ={}ENQUEUE(Q,s)while Q!={}
u=DEQUEUE(Q)for each G.Adj[u]
if v.color==WHITEv.color=GRAYv.d=u.d+1v.pi=uENQUEUE(Q,v)
u.color=BLACK
𝑂 (𝐸)
𝑂 (𝑉 )
𝑂 (𝑉 +𝐸)
22
證明 BFS 可以找到最短路徑• 定義 : s 到 v 的最短路徑的長度 ( 邊的數目 )
• Lemma 22.1: G=(V,E) 是一個 directed 或 undirected graph. s 是一個任意 vertex. 則對任何 edge , .
• 證明 : • 如果從 s 開始 , u 是 reachable, 那麼 v 也是 . • 這個狀況下 , sv 的最短路徑只可能比短 ( 最短路徑可能
不經由 u 過來 ). 不等式成立 .• 如果 u 不是 reachable 的話 , 那麼不等式一定成立 .s
v
u
su 最短路徑
可能有不經 u 的 sv 最短路徑
𝛿 (𝑠 ,𝑢)
𝛿 (𝑠 ,𝑣 )
23
證明 BFS 可以找到最短路徑• Lemma 22.2: G=(V,E) 是一個 directed 或 undirected graph. 對 G 及 vertex s 跑 BFS. 則結束的時候 , 每一個 , BFS 計算的 .• 證明 : • 使用歸納法證明 . 假設為”每一個 , BFS 計算的” .• 一開始把 s丟進 queue 的時候 , 成立 . . 而其他的 vertex . ( 起始條件 )• 當找到由 edge (u,v) 找到 vertex v 時 , 我們可以假設 . (k
的時候成立 )• 且我們知道 . ( 證出 k+1 的時候成立 )• 每個 v 都只做以上步驟 (更改 v.d 值 ) 一次 , 歸納法證明完
成 .
Lemma 22.1
24
證明 BFS 可以找到最短路徑• Lemma 22.3: 假設 BFS執行在 G=(V,E) 上 , queue 裡面有以下
vertices , 是 queue 的頭 , 而是 queue 的尾 . 則 and for .• 證明 :• 使用歸納法 . • 當 queue 一開始裡面只有 s 的時候成立 . ( 起始條件 )• 現在我們必須證明每次 dequeue 或 enqueue 的時候 , 都還是成立 .
(k 的時候 )• (k+1 的時候 )• (1) dequeue 的時候 , 變成新的 queue頭 . 但 . 且 . 其他不等式都
不變 . 因此成立 .• (2) enqueue 的時候 , 新加入的 vertex v變成 . • 此時我們剛剛把 u拿掉 ( 當時是 queue 的頭 ). 所以應該 . 所以 . • 且 , so .• 其他的不等式都不變 , 因此成立 .
BFS 用的 queue
𝑣2𝑣3…𝑣𝑟𝑣1 𝑣𝑟+1𝑢u
v
25
證明 BFS 可以找到最短路徑• Corollary 22.4: vertices 和 在執行 BFS 時被 enqueue
且在之前被 enqueue. 則當被 enqueue 的時候 .• 證明 : 直接從 Lemma 22.3 就可以得到 . 因為 v.d 只會被指定值一次 (enqueue 之前 ).
26
證明 BFS 可以找到最短路徑• Theorem 22.5: 證明 BFS 正確性 . BFS執行在 G=(V,E)
上 , 從開始 . BFS執行的時候會找出所有從 s reachable的 vertex . 結束的時候 , 每個 .
• 證明 : • ( 反證法 )假設有一些 v.d 不是 . 讓 v 是其中最小的一個 . • Lemma 22.2 說 , 所以現在 .• 此時 v 一定是從 s reachable, 不然 .• 假設 u 是 sv 最短路徑上 v 的前一個 vertex, 則• (隱含意思 : sv 上最短路徑上 su 的部分也是 su 的最
短路徑 )• 因為 , 所以 ( 已經假設 v 是其中最小的一個 ).
s
v
usv 最短路徑
𝛿 (𝑠 ,𝑢)
𝛿 (𝑠 ,𝑣 )
27
證明 BFS 可以找到最短路徑• 上頁得到• 考慮 BFS 從 Queue 裡面把 u dequeue 出來的時候 .• u 的鄰居 v 們 , 可能是 WHITE, GRAY, 或 BLACK• 如果是 WHITE, 則會設 , 矛盾 .• 如果是 BLACK, 則它之前已經被 dequeue 過 . Corollary 22.4 說 , 矛盾 .• 如果是 GRAY, 則它是剛剛 dequeue 某個 vertex w 的時
候被改成 GRAY 的 ( 比 u dequeue 的時間早 ). 所以 . 但 Corollary 22.4 說 , 因此 , 矛盾 .• 因此原假設不成立 . 證明完畢 .
28
下課休息
29
下課休息
30
Today’s Reading Assignment• Cormen B.4 (Appendix) and 22.1-22.2