95建中資訊科校內培訓 CK5925 黃上恩
演算法: Graph Algorithms
95/11/09
◤基礎篇◢
圖論起源於哥尼斯堡(Konigsberg)七橋問題:如何不重複的走過七座橋各一次,然後回到 原來的地方。尤拉(Euler)把這七座橋和陸地轉換為頂點和邊,將問題轉化為較抽象且較單純的 圖(Graph)來研究。
圖Graph
圖是由點(vertex/node)和邊(edge)所構成的集合。
點vertex
點可以是單純的點,或是加以編號、加權(weight)等。
相鄰(adjacent):兩個點相鄰若且唯若它們有邊連接。
連通(connected):兩個點連通若且唯若可以從其中一個點出發經過許多邊到達另一點。
度數(degree):一個點所連接的邊數。
邊edge
一個邊連接兩個點。在圖論中,我們不把兩條邊的交叉點視為一個頂點。
有向邊(directed edge):只能從一個頂點單方向到達另一個點。(相反:無向圖) 加權邊(weighted edge):賦予每個邊一個數值,可以加強描述兩個點之間的關係。
重邊(multi edge):不只一條邊連接相同的兩個頂點時,我們說這兩個點具有重邊。
環(loop):某一條邊連接同一個頂點。
圈(cycle):可以從某個點出發,沿著邊經過不同的頂點再回到同一個點。
路徑(path):從某個點沿著不重複的頂點到另一個點的走法。
各種不同的圖
有向圖(directed graph/digraph):具有有向邊的圖(相反:無向圖) 簡單圖(simple graph):不含multi edge和loop的無向圖
cyclic:包含cycle的圖(相反:acyclic)
連通圖(connected graph):圖中至少有一個點能夠到達其他所有點。
強連通圖(strong connected graph):有向圖中從任意一點出發都可以連到其他所有頂點。
完全圖(complete graph):任意兩點都是相鄰的。
樹(tree):connected acyclic graph
Graph Algorithms 1/3
95建中資訊科校內培訓 CK5925 黃上恩
圖的表示
相鄰矩陣(adjacency-matrix):用一個
n n
二維陣列紀錄n
個點相鄰的狀況(可能是標記 相連與否或是相連邊的權重)相鄰串列(adjacency-list):用n個list儲存,第a個list儲存每條從a連出去的邊的資料,
包括連接的點以及權重。
1 2 3 4 5
1 0 10 ∞ 30 100 1 2/10 4/30 5/100
2 ∞ 0 50 ∞ ∞ 2 3/50 -- --
3 ∞ ∞ 0 ∞ 10 3 5/10 -- --
4 ∞ ∞ 20 0 60 4 3/20 5/60 --
5 ∞ ∞ ∞ ∞ 0 5 -- -- --
圖的搜尋(DFS/BFS)
【題1】請你判斷一個圖有多少個相連的頂點群(connected components)。
【題2】請你判斷一個圖是否包含cycle。
【題3】Topological Sort(拓撲排序)
對於一個DAG(directed acyclic graph),請找出一種全部頂點的排列順序,使得所有
的邊都指向後面。(1)直觀的想法:依序取出In-degree(入度數)為0的頂點,並且把該 點所指向的所有點的In-degree減1。(2)使用DFS:記錄每個點進入finish狀態(黑色 狀態:已走完該節點的所有邊)的時間,然後由大至小排列即可。
【題4】Articulation Points
如果將某個點拿掉之後將導致兩個以上的connected components,那麼這個點被稱為 articulation point。(請參考2005培訓講義,基本想法為DFS。)
◤實力養成篇◢
最小花費展開樹(Minimum Spanning Tree, MST)
以一個有加權的圖的某些邊為邊,所有節點為節點,所形成的展開樹中,所有邊的加權 總和最小的一個。這題可以用Greedy解:
Graph Algorithms 2/3
95建中資訊科校內培訓 CK5925 黃上恩
請試著用Prim’s Algorithm以及Kruskal’s Algorithm找出下面圖中的MST。
Prim’s Algorithm
(1)找一個頂點放到MST節點集合中
(2)每次找到一個長度最小,
一端屬於MST但另一端不是 的邊。把這個邊以及端點 放進MST邊和點集合中。
(3)重複(2)的動作直到所 有點都被放到MST中為止。
Kruskal’s Algorithm
(1)把所有的邊依照邊長由小 至大排序。
(2)依序檢查每個邊,若把此邊加入MST集合而不會造成cycle
那麼就放進MST集合。否則忽略掉。
(3)檢查完每個邊或邊數達到n-1為止。
最短路徑(Shortest Path)
一個圖當中任意兩個點的最短路徑就是所有連接兩個點的路徑中最短的一條。(若邊無加 權,則為經過的邊數最少的一條)。單一源頭最短路徑通常用Dijkstra’s Algorithm解,若 要同時求出所有點對的最短路徑可用Floyd-Warshall Algorithm。
◤挑戰篇◢
【題5】一筆畫問題(Eulerian Cycle/Eulerian Path)
【題6】漢米爾頓圈(Hamiltonian Cycle)
是否存在一個Cycle,使得所有頂點恰走過一次?
【題7】Union-Find
給定一些節點,每次可以將某些節點群Union(合併為一個節點群)或詢問某兩個點是否屬 於同一個節點群(Find)。
Graph Algorithms 3/3