103 資訊學科培訓圖論 - BFS & DFS & 應用
講者 : 林庭宇
基本概念• BFS & DFS 就是圖形的「搜索」• 實作時分別需要用到 Queue & Stack• 可求取距離、連通等基礎資料• 應用極廣 知道 Stack 和 Queue
嗎 ?
Yes No
BFS
• 廣度優先搜索 (Breadth-first Search)• 先搜索完叉路再往下走• 由近而遠的搜索• 把走過的路連起來會變成一棵 tree• You need a Queue
DFS
• 深度優先搜索 (Depth-first Search)• 先搜索完整條路再去走叉路• 把走過的路連起來也會變成一棵 tree• You need a Stack
時間複雜度• 看資料型態而定
Adjacency matrix -> O(V^2)Adjacency lists -> O(V+E)
• BUT 要記得剪枝 !!!• 記下走過的點,以免重覆走浪費時間
練習時間ZJ
a290b224
a753d908
讓我們繼續看下去• DFS 延伸概念• 判斷 DAG(Direct Acylic Graph)• 拓樸排序 (Topological Sort)• 連通分量 (Connected Components)• 關節點 ( 割點 ,Cut Point)
OAO~~~
DFS 延伸概念• Discovery time Finishing time
1 273
6 548
5
8
6
1 3
24
7
DFS 延伸 2
Tree Edges: not yet discovered
Back Edges: discovered but not yet finished
Forward/Cross Edges: finished
DAG(Direct Acylic Graph)
• 有向無環圖• 判斷方式 :DFS• 他沒有 Back Edges!!!
拓樸排序• Topological Sort• 將圖上的點進行排序• 假如 A -> B ,則 A 要排在 B 之前• 前提 : 圖必須是一個 DAG• 用途 : 排大學課程、解決 DAG 圖各種問題
的利器
• 做法 :1. 先找出第一點 –
什麼點一定可以排在最前面 ?2. 進行拓樸排序 – 想想 DFS 延伸 !
=>1. 任意一個沒有「入邊」的點2.Finishing time!
拓樸範例• 一個可行的拓樸排序 :
9 2 0 5 6 3 7 8 1 4• Finishing time 反排 !!!
4
8
56
19
2
7
10
3
來個題目ZJ
a552 a454d917
連通分量• 連通關係 ( 就有向圖來討論 )
強連通 - 任兩點均有路來回
弱連通 - 化為無向圖後為相連圖形單向連通 - 任兩點至少有單向路可走
• 強連通 > 單向連通 > 弱連通
強連通分量• strongly connected components(SCC)
• 用處 : 收縮圖形
• 怎麼找 ?-> 還是 DFS
關節點 ( 割點 ,Cut Point)
• 無向圖中,少了就會使圖不連通的點
• 怎麼找割點 ?-> DFS again!!!
• 用 DFS tree 來想
THE ENDP.S. 蒙地卡羅 is good!
補 - Stack
• 就像堆盤子一樣
• 遞迴就是一種 Stack
• 陣列或 STL
補 - Queue
• 就像排隊一樣 ( 不考慮插隊 )
• 陣列或 STL
Back