Graph
by music960633
課程內容
• 1. 介紹、定義
• 2. 如何存圖
• 3. 圖上DFS、BFS
• 4. 連通塊數量
• 5. 二分圖判定
介紹、定義
• 基本元素:點和邊
• 點(vertex)
• 邊(edge)
• 圖:點的集合+邊的集合
介紹、定義
• 有向邊、無向邊
• 有向圖(directed graph)、無向圖(undirected graph)
介紹、定義
• 重邊
• 自環
介紹、定義
• 度(degree):和一個點v有相關的邊的數量
• 入度(in-degree):終點為v的邊數
• 出度(out-degree):起點為v的邊數
1 2
4 3
5
6 7
9 8
10
介紹、定義
• 路徑:由頭尾相連的邊組合而成的集合
• 路徑長:路徑上邊的數量或邊的權重總合
1 2
4 3
5
6 7
9 8
10
2 -5 3
-1
5 4
介紹、定義
• 環:起點和終點為同一點的路徑
• 如果沒特別說明,路徑也可以包含環
1 2
4 3
5
6 7
9 8
10
2 -5 3
-1
5 4
介紹、定義
• 連通圖:圖上任相異兩點間必存在一條路徑
1 2
4 3
5
6 7
9 8
10
如何存圖
• 當然可以像之前學過的linked list,將一個vertex視 為一個node,並用指標記錄和該點相鄰的點
• 缺點:實做不方便
• 無向邊可想成兩條相反的有向邊
如何存圖
• 方法一:相鄰矩陣(adjacent matrix)
• 無向圖
1 2
4 3
5
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 0
3 1 0 0 1 1
4 0 1 1 0 1
5 0 0 1 1 0
如何存圖
• 方法一:相鄰矩陣(adjacent matrix)
• 有向圖
1 2
4 3
5
1 2 3 4 5
1 0 1 0 0 0
2 0 0 0 1 0
3 1 0 0 0 1
4 0 0 1 0 1
5 0 0 0 0 0
如何存圖
• 方法一:相鄰矩陣(adjacent matrix)
• 有向圖+邊有權重
1 2
4 3
5 2 -5 3
-1
5 4
1 2 3 4 5
1 ? 2 ? ? ?
2 ? ? ? 3 ?
3 -5 ? ? ? 4
4 ? ? -1 ? 5
5 ? ? ? ? ?
1 2 3
2 1 4
3 1 4 5
4 2 3 5
5 3 4
如何存圖
• 方法二:相鄰串列(adjacent list)
• 無向圖
1 2
4 3
5
1 2
2 4
3 1 5
4 3 5
5
如何存圖
• 方法二:相鄰串列(adjacent list)
• 有向圖
1 2
4 3
5
1 (2,2) 2 (4,3)
3 (1,-5) (5,4) 4 (3,-1) (5,5) 5
如何存圖
• 方法二:相鄰串列(adjacent list)
• 有向圖+邊有權重
1 2
4 3
5 2 -5 3
-1
5 4
如何存圖
• 比較
• 相鄰矩陣
• 空間複雜度:O(V2)
• 查詢兩個點之間是否有邊:O(1)
• 遍歷一個點v周圍的邊:O(V)
• 相鄰串列
• 空間複雜度:O(E)
• 查詢兩個點之間是否有邊:O(degree(v))
• 遍歷一個點v周圍的邊:O(degree(v))
圖上DFS、BFS
• 如果你對tree的DFS、BFS了解了話應該很快可以上手
• DFS:
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 0
3 1 0 0 1 1
4 0 1 1 0 1
5 0 0 1 1 0
1 2
4 3
5
圖上DFS、BFS
• 如果你對tree的DFS、BFS了解了話應該很快可以上手
• DFS:
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 0
3 1 0 0 1 1
4 0 1 1 0 1
5 0 0 1 1 0
1 2
4 3
5
圖上DFS、BFS
• 如果你對tree的DFS、BFS了解了話應該很快可以上手
• DFS:
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 0
3 1 0 0 1 1
4 0 1 1 0 1
5 0 0 1 1 0
1 2
4 3
5
圖上DFS、BFS
• 如果你對tree的DFS、BFS了解了話應該很快可以上手
• DFS:
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 0
3 1 0 0 1 1
4 0 1 1 0 1
5 0 0 1 1 0
1 2
4 3
5
圖上DFS、BFS
• 如果你對tree的DFS、BFS了解了話應該很快可以上手
• DFS:
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 0
3 1 0 0 1 1
4 0 1 1 0 1
5 0 0 1 1 0
1 2
4 3
5
圖上DFS、BFS
• 如果你對tree的DFS、BFS了解了話應該很快可以上手
• DFS:
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 0
3 1 0 0 1 1
4 0 1 1 0 1
5 0 0 1 1 0
1 2
4 3
5
圖上DFS、BFS
• 如果你對tree的DFS、BFS了解了話應該很快可以上手
• DFS:
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 0
3 1 0 0 1 1
4 0 1 1 0 1
5 0 0 1 1 0
1 2
4 3
5
圖上DFS、BFS
• 如果你對tree的DFS、BFS了解了話應該很快可以上手
• DFS:
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 0
3 1 0 0 1 1
4 0 1 1 0 1
5 0 0 1 1 0
1 2
4 3
5
圖上DFS、BFS
• 如果你對tree的DFS、BFS了解了話應該很快可以上手
• DFS:
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 0
3 1 0 0 1 1
4 0 1 1 0 1
5 0 0 1 1 0
1 2
4 3
5
圖上DFS、BFS
• 如果你對tree的DFS、BFS了解了話應該很快可以上手
• DFS:
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 0
3 1 0 0 1 1
4 0 1 1 0 1
5 0 0 1 1 0
1 2
4 3
5
圖上DFS、BFS
• 如果你對tree的DFS、BFS了解了話應該很快可以上手
• DFS:
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 0
3 1 0 0 1 1
4 0 1 1 0 1
5 0 0 1 1 0
1 2
4 3
5
圖上DFS、BFS
• 如果你對tree的DFS、BFS了解了話應該很快可以上手
• DFS:
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 0
3 1 0 0 1 1
4 0 1 1 0 1
5 0 0 1 1 0
1 2
4 3
5
圖上DFS、BFS
• 如果你對tree的DFS、BFS了解了話應該很快可以上手
• DFS:
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 0
3 1 0 0 1 1
4 0 1 1 0 1
5 0 0 1 1 0
1 2
4 3
5
圖上DFS、BFS
• 如果你對tree的DFS、BFS了解了話應該很快可以上手
• DFS:
1 2 3 4 5
1 0 1 1 0 0
2 1 0 0 1 0
3 1 0 0 1 1
4 0 1 1 0 1
5 0 0 1 1 0
1 2
4 3
5
圖上DFS、BFS
• DFS、BFS注意事項
• 1. 要記錄一個點是否被拜訪過,以免重複拜訪
• 2. 走訪前記得判斷是否拜訪過
• 3. 走訪後記得將該點設為已經拜訪過
• 很多RE、TLE就是沒注意這些而造成的!
連通塊數量
• 如何判定一張無向圖中有幾個連通塊呢?
連通塊數量
• 注意到:做完一次DFS後,所有在同一個連通塊中的點都 會被拜訪到,不在同一個連通塊中就不會被拜訪到
• 計算做了幾次DFS後全部的點都被拜訪到就好了!
二分圖判定
• 二分圖:一個無向圖中的點可以被分成兩個集合,使得同 集合內的點互不相鄰
• 黑白染色:將圖上的點塗成黑或白,使得每條邊的兩端必 不同色
二分圖判定
• 如何判定一個無向圖是否為二分圖呢?
• 1. 隨便找一個點,塗上黑或白
• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色
• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖
二分圖判定
• 如何判定一個無向圖是否為二分圖呢?
• 1. 隨便找一個點,塗上黑或白
• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色
• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖
二分圖判定
• 如何判定一個無向圖是否為二分圖呢?
• 1. 隨便找一個點,塗上黑或白
• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色
• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖
二分圖判定
• 如何判定一個無向圖是否為二分圖呢?
• 1. 隨便找一個點,塗上黑或白
• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色
• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖
二分圖判定
• 如何判定一個無向圖是否為二分圖呢?
• 1. 隨便找一個點,塗上黑或白
• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色
• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖
二分圖判定
• 如何判定一個無向圖是否為二分圖呢?
• 1. 隨便找一個點,塗上黑或白
• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色
• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖
OK
二分圖判定
• 如何判定一個無向圖是否為二分圖呢?
• 1. 隨便找一個點,塗上黑或白
• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色
• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖
二分圖判定
• 如何判定一個無向圖是否為二分圖呢?
• 1. 隨便找一個點,塗上黑或白
• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色
• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖
二分圖判定
• 如何判定一個無向圖是否為二分圖呢?
• 1. 隨便找一個點,塗上黑或白
• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色
• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖
not OK!!!
結語
• 圖論很重要,很多看起來跟圖論沒關係的問題其實可以轉 成圖論來解,因此基本的DFS、BFS一定要熟
• 很多圖上的問題都可以只靠DFS、BFS做出來
• 大家加油!