圖形走訪
圖形的走訪目的在於從某個頂點開始,根據不同的方法走訪完全部的頂點,透過圖形的走訪可以判斷圖形是否連通,並且可以得知連通的路徑,走訪的方法分為以下兩種:
深度優先搜尋法(Depth-First Search, DFS)
深度優先搜尋法使用到遞迴和堆疊的兩種技巧,選擇圖形中任意一個頂點作為起點開始走訪,拜訪過的頂點就做標記為已拜訪,再將和該頂點相鄰且未拜訪過的其他頂點放入堆疊中,接著從堆疊中取出一個頂點開始新一輪的拜訪,重複以上步驟,直到全部的頂點都被拜訪過。如圖所示:
廣度優先搜尋法(Breadth-First Search, BFS)
廣度優先搜尋法使用到遞迴和佇列的兩種技巧,選擇圖形中任意一個頂點作為起點開始走訪,拜訪過的頂點就做標記為已拜訪,再將和該頂點相鄰且未拜訪過的其他頂點放入佇列中,接著從佇列中取出一個頂點開始新一輪的拜訪,重複以上步驟,直到全部的頂點都被拜訪過。如圖所示:
擴張樹
擴張樹是圖形以最少的邊來連結所有頂點,且不會形成循環的樹狀結構。通常一個圖形不只有一棵擴張樹。如圖所示:
有一種擴張樹叫做最小花費擴張樹,顧名思義就是在附有權重值(成本)的圖形中,花費最小成本路徑的擴張樹就是最小花費擴張樹。加權圖形可以透過以下兩種演算法得到最小花費擴張樹:
Prim演算法
首先選定任意一個頂點作為起點,接著列出所有和該頂點相連的其他頂點,並選擇成本最小的路徑,並將新頂點和路徑放入最小擴張樹,若該路徑會造成循環,則選擇次小的路徑,重複以上步驟,直到所有頂點都放入最小擴張樹中。如圖所示:
Kruskal演算法
首先將各路徑依照權重大小做升序排列,接著從權重最低的路徑開始放入最小擴張樹中,如果該路徑會造成循環,則選擇下一條路徑,重複以上步驟,直到所有頂點都放入最小擴張樹中。如圖所示:
參考資料: