圖的遍歷
樹的遍歷
存好圖後,為了獲得某些資訊,需要遍歷或搜索圖。
- 虛擬碼
1 2 3 4 5 |
|
根據優先順序不同,有兩種做法
- 深度優先搜尋 (Depth First Search, DFS):每次都嘗試往更深點走。
-
廣度優先搜尋 (Breadth First Search, BFS):先把同一層的點(相同距離)走完,在走下一層。
-
DFS v.s. BFS
-
選用資料結構
- DFS:越早「資料結構」加入的點會越後面拿出來,因此要用
stack
。 - BFS:越早「資料結構」加入的點會越前面拿出來,因此要用
queue
。
- DFS:越早「資料結構」加入的點會越後面拿出來,因此要用
範例程式碼
- DFS
1 2 3 4 5 6 7 8 9 10 11 |
|
- BFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
時間戳記 (Time stamp)
在 DFS 過程,可以記錄每個點進入和離開的順序,時間戳記可表示兩點的先後關係,通常用在以下地方:
- 最低共同祖先
- 樹壓平
- 有向圖的強連通元件
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
例題練習
- UVa 00572 - Oil Deposits
- UVa 11624 - Fire!
- UVa 11953 - Battleships
- Codeforces 598D - Igor In the Museum