從正反兩個方向進行寬度優先搜搜,可以大大減少搜尋量,提高搜尋速度。
從初始狀態和目標狀態兩個方向同時進行擴充套件,如果兩顆解答樹在某個節點第一次發生重合,即可終止此搜尋過程,則該節點所連線的兩條路徑所拼成的路徑就是最優解。
通常有兩種搜尋方式
1.兩個方向交替擴充套件
2.選擇節點個數較少的那個方向先擴充套件
方法2只需要略加修改控制結構,每次while迴圈時只擴充套件正反兩個方向中節點數目較少的那乙個,可以使兩邊的發展速度保持一定的平衡,從而減少總擴充套件節點的個數,加快搜尋速度。
int head[2],tail[2這種包裝的暴力也就我這種不會正解蒟蒻用吧],ans;
struct s q[2][maxn];//
佇列int v[2][maxn][maxn];//
記錄訪問節點的陣列
int dis[2][maxn][maxn];//
尋找最短路徑時記錄陣列
int dx[10],dy[10];//
擴充套件方向
int expand(int k)//
對k佇列進行擴充套件}}
return0;
}void
bfs()
q[0][1].x=startx; q[0][1].y=starty;
q[1][1].x=endx; q[1][1].y=endy;
v[0][q[0][1].x][q[0][1].y]=1
; v[
1][q[1][1].x][q[1][1].y]=1
; tail[
0]=head[0]=tail[1]=head[1]=1
;
while(head[0]<=tail[0]&&head[1]<=tail[1
])
else
//方法二,擇優擴充套件
}
return
;}
寬度優先搜尋
include using namespace std const int n 700 const int inf 0x3f3f3f3f int dir 10 int n,a,b,ans 1000000 flag 0 int floor n struct node int check node tm...
寬度優先搜尋
寬度優先搜尋演算法 又稱廣度優先搜尋 是最簡便的圖的搜尋演算法之一,這一演算法也是很多重要的圖的演算法的原型。dijkstra單源最短路徑演算法和prim最小生成樹演算法都採用了和寬度優先搜尋類似的思想。其別名又叫bfs,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說...
寬度優先搜尋
寬度優先搜尋也是搜尋的手段之一。它與深度優先搜尋類似,從某個狀態出發探索所有可以到達的狀態。const int inf 100000000 使用pair表示狀態時,使用typedef會更加方便一些 typedef pair p char maze max n max m 1 表示迷宮的字串陣列 in...