一、雙向佇列bfs:
首先乙個很神奇的小乾貨:
雙端對列duque!
雙端佇列中的元素可以從兩端彈出
常用操作(感覺超級超級複雜):
(1) 建構函式雙向佇列bfs:deque():建立乙個空deque
deque(int nsize):建立乙個deque,元素個數為nsize
deque(int nsize,const t& t):建立乙個deque,元素個數為nsize,且值均為t
deque(const deque &):複製建構函式
(2) 增加函式
void push_front(const t& x):雙端佇列頭部增加乙個元素x
void push_back(const t& x):雙端佇列尾部增加乙個元素x
iterator insert(iterator it,const t& x):雙端佇列中某一元素前增加乙個元素x
void insert(iterator it,int n,const t& x):雙端佇列中某一元素前增加n個相同的元素x
void insert(iterator it,const_iterator first,const_iteratorlast):雙端佇列中某一元素前插入另乙個相同型別向量的[forst,last)間的資料
(3) 刪除函式
iterator erase(iterator it):刪除雙端佇列中的某乙個元素
iterator erase(iterator first,iterator last):刪除雙端佇列中[first,last)中的元素
void pop_front():刪除雙端佇列中最前乙個元素
void pop_back():刪除雙端佇列中最後乙個元素
void clear():清空雙端佇列中最後乙個元素
(4) 遍歷函式
reference at(int pos):返回pos位置元素的引用
reference front():返回首元素的引用
reference back():返回尾元素的引用
iterator begin():返回向量頭指標,指向第乙個元素
iterator end():返回指向向量中最後乙個元素下乙個元素的指標(不包含在向量中)
reverse_iterator rbegin():反向迭代器,指向最後乙個元素
reverse_iterator rend():反向迭代器,指向第乙個元素的前乙個元素
(5) 判斷函式
bool empty() const:向量是否為空,若true,則向量中無元素
(6) 大小函式
int size() const:返回向量中元素的個數
int max_size() const:返回最大可允許的雙端對了元素數量值
(7) 其他函式
void swap(deque&):交換兩個同型別向量的資料
void assign(int n,const t& x):向量中第n個元素的值設定為x
適用範圍:
邊權值為可能有,也可能沒有(由於 bfs 適用於權值為 1 的圖,所以一般是 0 or 1),或者能夠轉化為這種邊權值的最短路問題。
實現:一般情況下,我們把沒有權值的邊擴充套件到的點放到隊首,有權值的邊擴充套件到的點放到隊尾。這樣即可保證在整個佇列中,像普通 bfs 一樣,越靠近隊首,權值越小,且權值零一之間有分隔。
模板:
while(佇列不為空)
}
2.雙向寬度搜尋:(看懂不會寫悄咪咪)
從狀態圖上起點和終點同時開始進行寬度/深度優先搜尋,如果發現相遇了,那麼可以認為是獲得了可行解。
3.hash 判重(沒有看懂悄咪咪)
廣搜的優化
其實主要的思想與深搜類似 放兩個題吧 這個題思想很好 一開始我都不知道qwq include include include include include using namespace std const int n 300000 int t,r,c,n intdis n p n cnt boo...
廣搜優化題目總結
題面 這道題之前打過,但那時候打題太水了,沒有真正掌握這道題的知識點。果然我還是太蒻了 這道題的解法是先建邊,對於每乙個單位正方形,將有邊相連的兩個對角建一條長度為0的無向邊,另外兩個對角建一條長度為1的無向邊。然後可以跑最短路或者用雙端佇列bfs 0 1bfs 跑最短路的話要注意由於是網格圖spf...
pku1184很有技巧的廣搜
題意 有乙個六位數,開始游標在第一位數上,現在通過向左,右移動游標,將游標上的數加,減一,與第一,五個數交換這幾個操作變為另乙個數 游標在任何地方都滿足 求最少的運算元。分析 開始想雙向廣搜,狀態為6 10 6個狀態,和單向廣搜是一樣的,會超時。後面想的幾種優化發現根本就不叫優化。最後還是看了dis...