學習筆記 雙向BFS

2021-09-11 05:25:30 字數 2599 閱讀 4671

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

2+n3

+...

...+

nm

n+n^+n^+......+n^

n+n2+n

3+..

....

+nm個狀態,狀態數就是nm+

1n^

nm+1

數量級的,若是雙向廣搜呢?在路徑中點就能相遇,狀態數是2∗n

m/2+

12*n^

2∗nm/2

+1數量級的,比起樸素的bfs,列舉狀態數少了很多,所以對於從起始狀態和目標狀態已知的情況,我們可以使用雙向bfs來優化程式的時間複雜度。下面通過乙個例子來看看優化的效果。

原題傳送門->洛谷p1379

搜先看一下樸素的單搜

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define il inline

#define min(a,b) (a#define max(a,b) (a>b?a:b)

#define max ((int)1e9)

struct node };

int dr[

2];int ans[3]

[3];

il bool

check

(const

int map[3]

[3])

il int

get(

int map[3]

[3])

return ans;

}map<

int,

bool

> vis;

intmain()

queue q;

q.push(0

});while

(!q.

empty()

)for

(int k =

0; k <

4; k++)}

}return0;

}

就是很樸素的模擬,然後暴力搜尋。判重用並查集會快,可是蒟蒻當時不會
#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define il inline

#define min(a,b) (a#define max(a,b) (a>b?a:b)

#define max ((int)1e9)

int ans =

123804765

;int dr[

2]=;

il int

getint

(int map[3]

[3])

return ans;

}queue<

int> q1, q2;

map<

int,

int> cc;

map<

int,

int> res;

intmain()

q1.push

(g); cc[g]=1

; res[g]=0

;//兩個佇列,乙個向前,乙個向後

q2.push

(ans)

; cc[ans]=2

; res[ans]=0

;bool is;

while

(!q1.

empty()

||!q2.

empty()

)else

for(

int i =

2, g = now; i >=

0; i--

)for

(int j =

2; j >=

0; j--

)for

(int k =

0; k <

4; k++)if

(cc[now]

+ cc[temp]==3

) res[temp]

= res[now]+1

; cc[temp]

= cc[now];if

(is)q1.

push

(temp)

;else q2.

push

(temp)

;swap

[y][y_]);

}}}return0;

}

雙向BFS模板

如果已經知道搜尋的開始狀態和結束狀態,要找乙個滿足某種條件的一條路徑 一般是最短路徑 為了避免無謂的 組合 產生,就可以採取雙向廣度搜尋演算法,也就是從開始狀態和結束狀態同時開始搜尋,乙個向前搜,乙個向後找。這樣做的好處是什麼?我們不妨假設每次搜尋的分支因子是r,如果最短的路徑長為l的話 也就是搜了...

雙向bfs模板

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

所謂的 雙向BFS

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