雙向BFS
我們知道,BFS是往廣處去搜索,我們把這想象成一個以起點為圓心的一個圓,每向前走一步,就是圓的半徑增大一個單位,而圓的每個單位面積上是一種狀態,當圓增大到目標點那麽大時,找到了答案,搜索結束。那麽顯然的,當半徑較大時,每走一步就會有十分大量的狀態需要來儲存( S=πr2 )。通常的,我們用“判重”的方法來解決,但是在這裏,還有一種優化方法:雙向搜索。
雙向搜索適用於起點和終點狀態都很明確的搜索題。試想,我從起點推算到終點,與我從終點推算到起點,最後得到的最少步驟數一定是相等的,所以我們可以從起點和終點同時搜索。同樣用圓來打比方,假設以起點為圓心畫圓時,最終半徑為r,以終點為圓心畫圓時,最終半徑為R。那麽顯然有:
πr2+πR2≤π(r+R)2
所以當害怕BFS會TLE時,不妨打一打雙向BFS。
雙向BFS
相關推薦
poj 1915 Knight Moves 【雙向bfs】
ask blank time problem one sum for urn == Knight Moves Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22121 Acc
第十場 hdu 6171 Admiral(雙向bfs找交點)
pos 交換 size php log print 如果 雙向 dmi http://acm.hdu.edu.cn/showproblem.php?pid=6171 題目大意:給你一個塔形的數據共有1個0、2個1、3個2、4個3、5個4、6個5.你能夠把0這個數據和它的
【雙向bfs】2017多校訓練十 HDU 6171 Admiral
isp hide splay 編號 sig push pac ans logs 【題意】 現在給出一個三角矩陣,如果0編號的在點(x,y)的話,可以和(x+1,y),(x-1,y),(x+1,y+1),(x-1,y-1)這些點進行交換。 我們每一次只能對0點和其他點進行交
UVA 1599 Ideal Path(雙向bfs+字典序+非簡單圖的最短路+隊列判重)
ems code can scan min 時機 define index end https://vjudge.net/problem/UVA-1599 給一個n個點m條邊(2<=n<=100000,1<=m<=200000)的無向圖,每條邊上都塗
雙向BFS
最終 圓心 假設 就會 優化方法 步驟 起點 適用於 有一種 我們知道,BFS是往廣處去搜索,我們把這想象成一個以起點為圓心的一個圓,每向前走一步,就是圓的半徑增大一個單位,而圓的每個單位面積上是一種狀態,當圓增大到目標點那麽大時,找到了答案,搜索結束。那麽顯然的,當半徑較
Nightmare Ⅱ(雙向BFS)
clu next 什麽是 separate contains 我們 dream 人的 before Problem Description Last night, little erriyue had a horrible nightmare. He dreamed
雙向BFS統計
aps def sign col eps class sum type sta Hdu1195 兩個四位密碼 問你最少多少步能到達 /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,s
【HDU3085】nightmare2 雙向BFS
clas 區域 雙向 ron 三層 scanf right 擴展 void 對於搜索樹分支很多且有明確起點和終點的情況時,可以采用雙向搜索來減小搜索樹的大小。 對於雙向BFS來說,與單向最大的不同是雙向BFS需要按層擴展,表示可能到達的區域。而單向BFS則是按照單個節點進行
uva-704-暴力列舉-雙向bfs
題意:倆個轉盤,24個數字,每個轉盤都可以順時針,逆時針旋轉.終點固定. 問:給定一個起點,能不能在16步內轉到終點 解法:雙向bfs,終點走8步,起點走8步,判斷從起點生成的狀態是否在終點裡面,如果在即是有解 注意題目要輸出轉動的方向,並且方向字串要最小,所以,在某一步有解事,要把當前層數走完,取最小
HDU3085-nightmare2(雙向BFS)
這道題給人的第一感覺就是非常繁瑣,因為要考慮兩個人狀態以外還要考慮鬼對人的影響,一開始是想讓鬼也寬搜,然後每次都去考慮這個地方的位置是否已經被鬼覆蓋過。 但是我們如果注意到鬼是可以穿過牆的,也就是說我們通過曼哈頓距離就可以判斷出鬼能覆蓋的位置,這樣我們只需要通過一個簡單的計算來判定是否這個地
hdu3085Nightmare Ⅱ(雙向BFS)
傳送門:http://acm.hdu.edu.cn/showproblem.php?pid=3085 Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768
UVA1601The Morning after Halloween 單向加雙向bfs
題意:w*h(w,h16)網格上有n(n3)個小寫字母(代表鬼)。要求把它們分別移動到對應的大寫字母裡。每步可以有多個鬼同時移動(均為往上下左右四個方向之一移動),但每步結束之後任何兩個鬼不能佔用同一個位置,也不能在一步之內交換位置。 先來第一種單向bfs,需要注意的是如果像平常bfs判斷的話,
hdu1043 雙向bfs+康拓展開【經典】
題意大致就是給你一個3X3的矩陣,你要把矩陣轉換成12345678的形式,在矩陣中是有一個空缺處可以供你移動滑塊的,問你是否可以把給你的矩陣轉換成12345678的形式,算了題意自己去看吧,有圖更加直接 思路:這裡主要考慮這幾個方面:第一個如何判斷經過一定轉換的矩陣是規範矩陣?這裡就用到了康
Nightmare Ⅱ -雙向BFS(待更改)
Nightmare Ⅱ #include<bits/stdc++.h> using namespace std; #define maxn 888 char mmp[maxn][maxn]; bool vis1[maxn][maxn]; bool vis2[
初次學習(雙向 bfs)
為了記錄一下自己學過的東西 雙向BFS,既然是雙向的,那麼就得知道起點和終點,這樣,我們就可以進行雙向搜尋了。 但是,雙向BFS是否真的可以提高效率呢?如果能,那麼又能提高多少呢? 看到過一個圖,說雙BFS可以在BFS的基礎上把時間和空間複雜度上都減半。實際上
【UVa】【雙向BFS】1601 The Morning after Halloween
UVa 1601 The Morning after Halloween 題目 題目大意 在一個W×HW\times HW×H的網格上有N(N≤3)N(N\le3)N(N≤3)個鬼,用小寫字母表示。要求將所有鬼移動到對應的大寫字母處。每步可以有多個鬼移動(均為
HDU 3085 Nightmare Ⅱ [雙向BFS]
Nightmare Ⅱ Problem Description Last night, little erriyue had a horrible nightmare. He dreamed that he and his girl friend were trapped
bzoj5049 [Lydsy1709月賽]導航系統 雙向bfs
Description 小Q來到了一個隨機的國度。這個國度由n座城市和m條雙向道路構成。因為這個國度崇尚隨機,因此m條邊是用隨機選擇兩端點的方式生成的。充滿好奇的小Q想在這裡進行k次隨機的旅行,每次的
有關雙向BFS的一次嘗試
什麼是雙向BFS 雙向BFS在寒假解決圖論中搜索問題時就已經遇到了,單向BFS是從一個起點到一個終點搜尋,找最短路,而雙向BFS是不僅從起點到終點搜尋,而且同時從終點出發,向起點進行搜尋。雙向BFS看起來能快很多。 當時和龍哥討論,感覺雙向BFS理論上不會快到哪去,畢竟搜尋就是列舉的過程,加
2017多校聯合第十場/HDU 6171 Admiral 雙向bfs + 雜湊
Suppose that you are an admiral of a famous naval troop. Our naval forces have got 21 battleships. There are 6 types of battleships. First, we have got on