• 沒有找到結果。

by music960633 Graph

N/A
N/A
Protected

Academic year: 2022

Share "by music960633 Graph"

Copied!
45
0
0

加載中.... (立即查看全文)

全文

(1)

Graph

by music960633

(2)

課程內容

• 1. 介紹、定義

• 2. 如何存圖

• 3. 圖上DFS、BFS

• 4. 連通塊數量

• 5. 二分圖判定

(3)

介紹、定義

• 基本元素:點和邊

• 點(vertex)

• 邊(edge)

• 圖:點的集合+邊的集合

(4)

介紹、定義

• 有向邊、無向邊

• 有向圖(directed graph)、無向圖(undirected graph)

(5)

介紹、定義

• 重邊

• 自環

(6)

介紹、定義

• 度(degree):和一個點v有相關的邊的數量

• 入度(in-degree):終點為v的邊數

• 出度(out-degree):起點為v的邊數

1 2

4 3

5

6 7

9 8

10

(7)

介紹、定義

• 路徑:由頭尾相連的邊組合而成的集合

• 路徑長:路徑上邊的數量或邊的權重總合

1 2

4 3

5

6 7

9 8

10

2 -5 3

-1

5 4

(8)

介紹、定義

• 環:起點和終點為同一點的路徑

• 如果沒特別說明,路徑也可以包含環

1 2

4 3

5

6 7

9 8

10

2 -5 3

-1

5 4

(9)

介紹、定義

• 連通圖:圖上任相異兩點間必存在一條路徑

1 2

4 3

5

6 7

9 8

10

(10)

如何存圖

• 當然可以像之前學過的linked list,將一個vertex視 為一個node,並用指標記錄和該點相鄰的點

• 缺點:實做不方便

• 無向邊可想成兩條相反的有向邊

(11)

如何存圖

• 方法一:相鄰矩陣(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

(12)

如何存圖

• 方法一:相鄰矩陣(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

(13)

如何存圖

• 方法一:相鄰矩陣(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 ? ? ? ? ?

(14)

1 2 3

2 1 4

3 1 4 5

4 2 3 5

5 3 4

如何存圖

• 方法二:相鄰串列(adjacent list)

• 無向圖

1 2

4 3

5

(15)

1 2

2 4

3 1 5

4 3 5

5

如何存圖

• 方法二:相鄰串列(adjacent list)

• 有向圖

1 2

4 3

5

(16)

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

(17)

如何存圖

• 比較

• 相鄰矩陣

• 空間複雜度:O(V2)

• 查詢兩個點之間是否有邊:O(1)

• 遍歷一個點v周圍的邊:O(V)

• 相鄰串列

• 空間複雜度:O(E)

• 查詢兩個點之間是否有邊:O(degree(v))

• 遍歷一個點v周圍的邊:O(degree(v))

(18)

圖上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

(19)

圖上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

(20)

圖上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

(21)

圖上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

(22)

圖上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

(23)

圖上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

(24)

圖上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

(25)

圖上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

(26)

圖上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

(27)

圖上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

(28)

圖上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

(29)

圖上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

(30)

圖上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

(31)

圖上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

(32)

圖上DFS、BFS

• DFS、BFS注意事項

• 1. 要記錄一個點是否被拜訪過,以免重複拜訪

• 2. 走訪前記得判斷是否拜訪過

• 3. 走訪後記得將該點設為已經拜訪過

• 很多RE、TLE就是沒注意這些而造成的!

(33)

連通塊數量

• 如何判定一張無向圖中有幾個連通塊呢?

(34)

連通塊數量

• 注意到:做完一次DFS後,所有在同一個連通塊中的點都 會被拜訪到,不在同一個連通塊中就不會被拜訪到

• 計算做了幾次DFS後全部的點都被拜訪到就好了!

(35)

二分圖判定

• 二分圖:一個無向圖中的點可以被分成兩個集合,使得同 集合內的點互不相鄰

• 黑白染色:將圖上的點塗成黑或白,使得每條邊的兩端必 不同色

(36)

二分圖判定

• 如何判定一個無向圖是否為二分圖呢?

• 1. 隨便找一個點,塗上黑或白

• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色

• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖

(37)

二分圖判定

• 如何判定一個無向圖是否為二分圖呢?

• 1. 隨便找一個點,塗上黑或白

• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色

• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖

(38)

二分圖判定

• 如何判定一個無向圖是否為二分圖呢?

• 1. 隨便找一個點,塗上黑或白

• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色

• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖

(39)

二分圖判定

• 如何判定一個無向圖是否為二分圖呢?

• 1. 隨便找一個點,塗上黑或白

• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色

• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖

(40)

二分圖判定

• 如何判定一個無向圖是否為二分圖呢?

• 1. 隨便找一個點,塗上黑或白

• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色

• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖

(41)

二分圖判定

• 如何判定一個無向圖是否為二分圖呢?

• 1. 隨便找一個點,塗上黑或白

• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色

• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖

OK

(42)

二分圖判定

• 如何判定一個無向圖是否為二分圖呢?

• 1. 隨便找一個點,塗上黑或白

• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色

• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖

(43)

二分圖判定

• 如何判定一個無向圖是否為二分圖呢?

• 1. 隨便找一個點,塗上黑或白

• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色

• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖

(44)

二分圖判定

• 如何判定一個無向圖是否為二分圖呢?

• 1. 隨便找一個點,塗上黑或白

• 2. 從這一點DFS、BFS,並將相鄰的點塗上相異的顏色

• 3. 如果塗色過程發生矛盾,則不是二分圖,否則就是二分圖

not OK!!!

(45)

結語

• 圖論很重要,很多看起來跟圖論沒關係的問題其實可以轉 成圖論來解,因此基本的DFS、BFS一定要熟

• 很多圖上的問題都可以只靠DFS、BFS做出來

• 大家加油!

參考文獻

相關文件

The vertex-cover problem is to find a vertex cover of minimum size in a given undirected graph. • 此問題的decision版本為NP-Complete

• vertex

Credit to Theory of Computer Games, 2018 Fall.. Normal BFS

Credit to Theory of Computer Games,

Credit to Theory of Computer Games, 2018 Fall.. Normal BFS

紅色 : 當今在的 Heap 被使用為合併後的 Heap...

• 下面介紹三種使用greedy algorithm產生minimum cost spanning

Given an undirected graph with nonnegative edge lengths and nonnegative vertex weights, the routing requirement of a pair of vertices is assumed to be the product of their weights.