Graph Algorithms Euler Circuit Hamilton Circuit
for Sprout 2014 by Chin Huang Lin
七橋問題 七橋問題
• 柯尼斯堡有七座橋,風光明媚,景色迷人
• 如果可以安排一條旅遊路線,恰好把七座橋都經過一次,那就不 腳痠不無聊,一路順暢身心富足
• 只是,一直都沒有人找到滿足要求的路線
From Wikipedia
轉成圖論問題的話……
轉成圖論問題的話……
• 給定一個無向圖,是否存在一條每條邊恰走過一次的路徑?
From Wikipedia
一筆畫問題!
一筆畫問題!
• 一筆畫問題有分成兩種:
• 一種形成一條路徑,稱為 Euler path
• 一種形成一個環,稱為 Euler circuit
觀察一下 觀察一下
• 顯然至少所有的邊要互相連通
• 按照路徑經過的方向,可以把無向邊有向化,分成入度與出度
• 不難發現,除了起點與終點以外,所有的點的入度數一定要與出 度數相同!
• 如果入度 > 出度,代表有進去卻沒出來的情況,那麼該點應該是終點
• 如果出度 > 入度,代表有莫名無中生有的情況,那麼該點應該是起點
• 入度與出度相同,也就是說原先的無向圖上一定度數為偶數
• 以上是必要條件
驗證一下 驗證一下
• 除了起點與終點外,所有的點度數都為偶數
→ 整張圖上只能有 0 個或 2 個偶點
• 這樣是否足夠充分呢?
• Yes!
• 底下我們用簡單的數學歸納法來給出構造性證明
驗證一下 驗證一下
• 遞迴證明法!
• 當邊數只有 0 或者 1 時,結論顯然成立
• 假設邊數 時成立,那麼對於一個邊數為 的圖……
• 假設 是偶數 ( 此時沒有奇點 ) ,那麼圖上必定存在環 。把 自圖上 移除後,由於任意點都只會移除偶數度,剩餘圖必定形成所有點度數仍 為偶數的若干連通塊。
• 由於 時成立,剩餘的每個連通塊都存在歐拉迴路。
• 把各個連通塊的歐拉迴路都「接在」與 的共同節點上,即形成原圖的 歐拉迴路
•
驗證一下 驗證一下
From DJWS
驗證一下 驗證一下
• 遞迴證明法!
• 當邊數只有 0 或者 2 時,結論顯然成立
• 假設邊數 時成立,那麼對於一個邊數為 的圖……
• 假設 是奇數 ( 此時有二奇點 ) ,那麼先在兩奇點之間新增一假想邊 形成圖 ,接著一樣在圖上選擇一個環 移除
• 因為環上邊數至少為 2 ,,又可以遞迴求解了!
• 完成 的歐拉迴路後,把 e 移除,並且選擇兩奇點作為起點終點即可
•
實作時間 實作時間
• 在證明中我們可以看到,其實 怎麼選,根本就不重要!
• 只要起點、終點選對,其實我們隨便走也可以!
• 走到山窮水盡,就代表一個 ( 有可能包含虛擬邊 ) ;接著遞 迴把剩下的部份的歐拉路「黏」到 上即可
•
算法框架 算法框架
1. 判斷奇點個數,若
• ,那麼無解
• ,則選擇其中一個奇點作為起點
• ,則選擇任意一個點作為起點
2. 在 DFS 框架內執行下列步驟
1) 若當前節點還有尚未走過的邊,那麼拜訪該邊,並在拜訪完後輸出該邊 2) 否則離開當前結點
3. 若還有節點尚未拜訪,則無解 4. 否則輸出順序即為一組解
•
Show time!
Show time!
2 1
3 4
5 6 7
8 9
12 10 11
15
16
13 14
Show time!
Show time!
2 1
3 4
5 6 7
8 9
12 10 11
15
16
13 14
1
Show time!
Show time!
2 1
3 4
5 6 7
8 9
12 10 11
15
16
13 14
1 2
Show time!
Show time!
2 1
3 4
5 6 7
8 9
12 10 11
15
16
13 14
1 2 6
Show time!
Show time!
2 1
3 4
5 6 7
8 9
12 10 11
15
16
13 14
1 2 6 5
Show time!
Show time!
2 1
3 4
5 6 7
8 9
12 10 11
15
16
13 14
1 2 6 5 4
Show time!
Show time!
2 1
3 4
5 6 7
8 9
12 10 11
15
16
13 14
1 2 6 5 4 3
Show time!
Show time!
2 1
3 4
5 6
8 9
12 10 11
15
16
13 14
7
1 2 6 5 4 3 7
Show time!
Show time!
2 1
3 4
5 6
8 9
12 10 11
15
16
13 14
7
1 2 6 5 4 3 7 8
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
13 14
7
1 2 6 5 4 3 7 8
9
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
13
14
9
7
1 2 6 5 4 3 7 8
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
13
14
9 8
7
1 2 6 5 4 3 7
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
13
14
9 8 7
7
1 2 6 5 4 3
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
13
14
9 8 7 3
7
1 2 6 5 4
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
13
14
9 8 7 3 4
7
1 2 6 5
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
13
14
9 8 7 3 4 5
7
1 2 6
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
13
14
9 8 7 3 4 5
7
1 2 6 10
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
13
14
9 8 7 3 4 5
7
1 2 6 10 11
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
13
14
9 8 7 3 4 5
7
1 2 6 10 11 12
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
13
14
9 8 7 3 4 5 12
7
1 2 6 10 11
13
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
9 8 7 3 4 5 12
7
14
1 2 6 10 11 14
13
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
9 8 7 3 4 5 12
7
14
1 2 6 10 11 14 13
13
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
9 8 7 3 4 5 12
7
14
1 2 6 10 11 14 13 16
13
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
9 8 7 3 4 5 12
7
14
1 2 6 10 11 14 13 16
15
13
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
9 8 7 3 4 5 12 15
7
14
1 2 6 10 11 14 13 16
13
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
9 8 7 3 4 5 12 15 16
7
14
1 2 6 10 11 14 13
13
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
9 8 7 3 4 5 12 15 16 13
7
14
1 2 6 10 11 14
13
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
9 8 7 3 4 5 12 15 16 13 14
7
14
1 2 6 10 11
13
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
9 8 7 3 4 5 12 15 16 13 14 11
7
14
1 2 6 10
13
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
9 8 7 3 4 5 12 15 16 13 14 11 10
7
14
1 2 6
13
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
9 8 7 3 4 5 12 15 16 13 14 11 10 6
7
14
1 2
13
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
9 8 7 3 4 5 12 15 16 13 14 11 10 6 2
7
14
1
13
9
Show time!
Show time!
2 1
3 4
5 6
8
12 10 11
15
16
9 8 7 3 4 5 12 15 16 13 14 11 10 6 2 1
7
14
有向圖的話……
有向圖的話……
• 在無向圖中,我們事實上是根據我們的需求自己幫邊定向
• 有向圖中,如果先天條件不良,我們就無能為力了
• 入點:出度數 = 入度數 – 1
• 出點:出度數 = 入度數 + 1
• 平衡點:出度數 = 入度數
• 不能有三種點以外的點
• 入點、出點都最多只能有一個
• 其餘點皆須為平衡點
有向圖的話……
有向圖的話……
• 如果整張圖連通 ( 從起點開始可以走到任意一點 ) ,那麼解的 存在性證明與無向圖完全相似
• 不同的是,在無向圖的算法中,輸出的順序之所以可以成立,來 自於「任意無向圖上的路徑逆序輸出依然合法」
• 有向圖中,把輸出逆序後才是一組合法的解
• 複雜度:皆為
•
哈密頓問題 哈密頓問題
• 目標為點的一筆畫問題!
• 給定一張圖 ( 有向或無向 ) ,是否存在一條路徑使得所有節點 恰好走過一次呢?
• 如果最後不用回到起點,則稱之為 Hamilton path
• 否則稱之為 Hamilton circuit
• 若一張圖中存在 Hamilton circuit ,則稱此圖為 Hamilton graph
• 圖上的點和邊關係密切,歐拉路問題有這麼好的解,是否可以套 用到哈密頓問題上呢?
Terrible Terrible
• 很遺憾地,不論是有向圖還是無向圖,哈密頓問題都已經被證明 是 NP-complete
• 目前僅知一個充分條件:
• 設 是一個無向簡單圖,。若對於任意的兩個頂點 都有 ,則 是 Ham ilton graph
(proved by Øystein Ore)
• 但這並不代表我們只能夠用 暴力求解
•
Dynamic Programming!
Dynamic Programming!
• 反正每個點走過之後就不會走第二次,對應著邊也不會有走兩次 的情形
• 只有「已經走過的點」和「當前走過的點」是重要的事情!
• 定義狀態 為「是否有可能當前在點 ,其中 這個集合已經拜 訪過」
•
Dynamic Programming!
Dynamic Programming!
• 初始時 ,其餘皆為
• 對於一個狀態 ,如果 且 ,那麼我們可以從 走到 ,轉移到
• 其中 通常以狀態壓縮實作
• ex. ,則可以用 表示
• 若使用 adjacent matrix 存邊方式,則每個狀態只需要 轉移
• 反正 沒辦法太大,不用考慮空間 的問題 :p
• 時間複雜度為