雙向BFS模板

2021-08-28 15:15:27 字數 2535 閱讀 4021

如果已經知道搜尋的開始狀態和結束狀態, 要找乙個滿足某種條件的一條路徑(一般是最短路徑),為了避免無謂的「組合**」產生,就可以採取雙向廣度搜尋演算法,也就是從開始狀態和結束狀態同時開始搜尋,乙個向前搜,乙個向後找。 這樣做的好處是什麼? 我們不妨假設每次搜尋的分支因子是r,如果最短的路徑長為l的話(也就是搜了l層),那麼,用一般的bfs演算法(不考慮去掉重複狀態),總的搜尋狀態數是r^l(^表示乘方運算);而如果採取雙向bfs演算法,那麼,從前往後搜,我們只需要搜尋l/2層,從後往前搜,我們也只要搜l/2層,因此,搜尋狀態數是2*(r^(l/2)),比普通bfs就快了很多了。 雙向bfs演算法的實質還是bfs,只不過兩邊同時開始bfs而已。還是可以利用佇列來實現:可以設定兩個佇列,乙個用於向前的bfs,另乙個用於向後的bfs,利用這兩個佇列,同時從前、後開始層次遍歷搜尋樹。

雙向廣搜模版:

void bfs_bothsides()//雙向bfs 

bool found=false;

memset(visited,0,sizeof(visited)); // 判重陣列

while(!q1.empty()) q1.pop(); // 正向佇列

while(!q2.empty()) q2.pop(); // 反向佇列

//*****=正向擴充套件的狀態標記為1,反向擴充套件標記為2

visited[s1.state]=1; // 初始狀態標記為1

visited[s2.state]=2; // 結束狀態標記為2

q1.push(s1); // 初始狀態入正向佇列

q2.push(s2); // 結束狀態入反向佇列

while(!q1.empty() || !q2.empty())

}void bfs_expand(queue&q,bool flag)

visited[t.state]=1; // 標記為在在正向佇列中

q.push(t); // 入隊}}

else // 在正向佇列中判斷

visited[t.state]=2; // 標記為在反向佇列中

q.push(t); // 入隊}}

}}

杭電-open the lock

題意:解開密碼鎖,從初始狀態到開鎖狀態問最少做幾次操作。操作可以是上下轉動(上下加減1,特別的:9 + 1 = 1, 1 - 0 = 9 )和交換兩個相鄰位(最左面的和最右面的不相鄰)。一共8+3=11種狀態擴充套件

標程:

#include#include#includeusing namespace std;

const int maxn=10010;

int vis[maxn];

int step[maxn];

struct node

st,ed;

int flag;

int minstep;

int toint(int num)

void toarray(int num,int arr)

void bfs_expand(queue& que,int choose)

else

next.status=toint(next.num);

int dis=step[curr.status]+1;

if(choose==0)

step[next.status]=dis;

vis[next.status]=1;

que.push(next);}}

else

step[next.status]=dis;

vis[next.status]=2;

que.push(next);}}

}}for(int i=0;i<3;i++)

vis[next.status]=1;

step[next.status]=dis;

que.push(next);}}

else

vis[next.status]=2;

step[next.status]=dis;

que.push(next);}}

}}void tbfs()

queueq1;

queueq2;

q1.push(st);

q2.push(ed);

memset(vis,0,sizeof(vis));

vis[st.status]=1;

vis[ed.status]=2;

step[st.status]=0;

step[ed.status]=0;

flag=false;

while(!q1.empty()||!q2.empty())

if(flag) return;

if(!q2.empty())

if(flag) return;

}}int main()

return 0;

}

**部分**:

雙向bfs模板

原題鏈結 是個裸的雙向bfs的題,看到乙份比較好的 我以前好像都是寫的兩個bfs的,而他這個寫在一起了,而且更好得體現了一層一層的搜尋的思想 比如原來做題的時候就遇到過,因為我是 輸出除錯法來debug的,所以原來列印座標的時候不知道這個點是在第幾步搜出來的,其實搜完一層後,新加的就是下一層了 這個...

所謂的 雙向BFS

雙向bfs,既然是雙向的,那麼就得知道起點和終點,這樣,我們就可以進行雙向搜尋了。但是,雙向bfs是否真的可以提高效率呢?如果能,那麼又能提高多少呢?看到過乙個圖,說雙bfs可以在bfs的基礎上把時間和空間複雜度上都減半。實際上,在許多的實際應用中,往往不僅僅是減半!我們假設,單向bfs需要搜尋n層...

學習筆記 雙向BFS

雙向bfs就是在一直當前狀態和期望狀態時,從當前和期望兩個狀態同時出發,直到某個狀態同時被訪問到兩次,那麼當前狀態 被訪問兩次的狀態 目標狀態就是當前狀態到目標狀態的解。那具體會有多塊呢?加入每一次搜尋都有n個新的狀態 比如迷宮問題就是上下左右四個狀態 從起點到目標路徑長為m,那就要搜尋n n 2 ...