[演算法] [C++ / Python] 深度優先搜尋 Depth-First-Search - Part II
在上次趴one 裡面我們已經 以一棵彩虹樹(?) 來 解釋了 DFS 的基礎步驟,並且用 C++ 以及 Python 實作了相關的程式碼,這次我們要來看看圖的部分。 啊,在這之前,我們簡單的複習一下 DFS 的要素: 1) 選擇起始點 2) 進入 DFS 後,先判斷是否已經到終端,如果是的話,離開 DFS 3) 把這個節點設為已走訪過 4) 尋找下一個可行的節點並進入,回到 2) 圖 當然是要先畫一張圖啦: 為了方便討論,這是個無向圖,也就是每條路都是雙向道。那我們開始吧!一樣先選一個起點,這裡我們選 1 ,可以看到,與 1 相連的節點有 2 和 3 ,根據 DFS 的精神,我們一樣要選一個點來「 深 」入討論,這裡我們就選 2,並同時約定,之後若要從多個點選擇的話,以數字小的為優先。 於是我們拿 2 來進行下一次的 DFS,結果找到了 3 , 4 。因為剛剛的約定,我們在這先選比較小的 3 來進行下一層的 DFS,並找到了 1 , 5 , 6 , 咦?1 號節點我們剛剛不是走過了嗎?沒錯,所以我們這次就不用理他,直接選 5 繼續吧。 接著我們就找到了 4 和 6 ,我們再接著選 4,結果發現他找到的 2 在前面就走訪過了,因此我們就返回到 5,並選擇 6 重新出發。結果發現,走 6 這條路也沒辦法找到還沒走訪過的節點,因此退回到 5。 而 5 呢?也找不到新的節點了,所以再退,就這樣一路退到 1,發現完全沒有新的節點,因此,圖的 DFS 到此結束。 程式碼實作 C++ void dfs(int now){ cout << now << " visited." << endl; for (int i = 1; i <= 6; i++){ if (!visited[i] && e[now][i] == 1){ // 如果還沒來過而且可以走到 visited[i] = true; dfs(i);