圖論算法之DFS與BFS
阿新 • • 發佈:2017-08-27
nod pty pop 直觀 遍歷 必須掌握 取出 二分 最短
- 概述(總)
- 含義特點
- 應用場景
- dfs
- 連通分量
- 二分圖判定
- 二叉樹的遞歸遍歷
- bfs
- 求割頂和橋
2.二叉樹的層次遍歷
- 代碼實現
/** * DFS核心偽代碼 * 前置條件是visit數組全部設置成false * @param n 當前開始搜索的節點 * @param d 當前到達的深度 * @return 是否有解 */ bool DFS(Node n, int d){ if (isEnd(n, d)){//一旦搜索深度到達一個結束狀態,就返回true return true; } for (Node nextNode in n){//遍歷n相鄰的節點nextNode if (!visit[nextNode]){// visit[nextNode] = true;//在下一步搜索中,nextNode不能再次出現 if (DFS(nextNode, d+1)){//如果搜索出有解 //做些其他事情,例如記錄結果深度等 return true; } //重新設置成false,因為它有可能出現在下一次搜索的別的路徑中 visit[nextNode] = false; } } return false;//本次搜索無解 }
/** * 廣度優先搜索 * @param Vs 起點 * @param Vd 終點 */ bool BFS(Node& Vs, Node& Vd){ queue<Node> Q; Node Vn, Vw; int i; //初始狀態將起點放進隊列Q Q.push(Vs); hash(Vw) = true;//設置節點已經訪問過了! while (!Q.empty()){//隊列不為空,繼續搜索! //取出隊列的頭Vn Vn = Q.front(); //從隊列中移除 Q.pop(); while(Vw = Vn通過某規則能夠到達的節點){ if (Vw == Vd){//找到終點了! //把路徑記錄,這裏沒給出解法 return true;//返回 } if (isValid(Vw) && !visit[Vw]){ //Vw是一個合法的節點並且為白色節點 Q.push(Vw);//加入隊列Q hash(Vw) = true;//設置節點顏色 } } } return false;//無解 }
- 總結(總)
- DFS適合此類題目:給定初始狀態跟目標狀態,要求判斷從初始狀態到目標狀態是否有解。
- BFS適合此類題目:給定初始狀態跟目標狀態,要求從初始狀態到目標狀態的最短路徑。
- 參考資料
圖論算法之DFS與BFS