C++之
廣度優先搜索算法篇
廣度優先搜索(又稱寬度優先搜索算法)是最簡便的圖的搜索算法之一,這一算法也是很多重要的圖的算法的原型。 Dijkstra單源最短路徑算法和Prim最小生成樹算法都采用了和寬度優先搜索類似的思想。其別名又叫BFS,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜索整張圖,直到找到結果為止。
廣度優先算在全書中也算厲害了,在我的私人定制的“NOI BOSS表”中也屬NO.2了,它和深搜不同,廣搜相對來說可以求出最短路徑,但就是時間復雜度略有差別。
看了下面這張表格可以了解廣搜與深搜的對比,也就可以看出兩者的優劣和
遍歷方式
|
深度優先搜索遍歷
|
廣度優先搜索遍歷
|
所用數據結構
|
棧
|
隊列
|
一般優化
|
最優性剪枝
可行性剪枝
|
Hash判重
雙向搜索
|
。
廣搜的核心思想就是:從初始結點開始,產生第一層節點,檢查目標結點是否在這些后繼結點之中,沒有,就擴展第一層節點,若沒有,用產生式規則得到第二層節點;檢查目標結點是否在這些后繼結點之中,沒有,就擴展第 二層節點……像這樣以此擴展節點、檢查,直到發現目標結點為止。
廣度優先搜索算法如下:(用 QUEUE)
廣搜的算法描述大體框架:
int bfs() { 初始化,初始狀態存入隊列; int head=0,tail=1;//head為首指針,tail為尾指針。 do { 指針head后移一位,指向待擴展結點; for(int i=1;i<=max;++i) { if(子結點符合條件) { tail指針增1,把新結點存入隊尾; if(新結點與原已產生的結點重復)刪去該結點(取消入隊,tail減1); else if(新結點是目標結點)輸出並推出; } } } while(head<tail);//隊列為空 }
廣搜的應用: