標籤:blog http io os ar strong on c log
概要:我們在初始狀態要到達終止狀態可以沿著同深度的向下搜尋,這樣範圍覆蓋更廣,在解的深度較小的時候十分適用。
技巧及注意:
bfs很多技巧啊,我來一一列舉吧:
注意:存bfs狀態時一定要盡量小化狀態,只存有效資訊來進行bfs,而不要存整個圖進去(QAQ,noip就是這樣掛的。當時太弱。。)
hash判重:在一些bfs題中所有元素的範圍(也可以自己映射唄)很小的情況下,我們假設有k個元吧,我們可以考慮用以基於k進位為底數的冪來進行hash,比如【wikioi】1004 四子連棋,【BZOJ】1054: [HAOI2008]移動玩具(bfs+hash),
數組判重:在一些情況下,比如純bfs或方向限制啊什麼的,可以開多維陣列來記錄訪問狀態。如:【wikioi】1026 逃跑的拉爾夫(方向判重),【BZOJ】1616: [Usaco2008 Mar]Cow Travelling遊盪的奶牛(dp/-bfs)(方案判重),【BZOJ】1644: [Usaco2007 Oct]Obstacle Course 障礙訓練課(bfs)(方向判重),
有障礙的距離:當出現這些起點到終點最多能越過k個障礙的圖給你bfs時,可以逆著想,我們想這個點到終點需要越過的最少障礙數,然後用k來判斷是否合法即可,比如:
多種約束:當約束條件增多時,我們可以考慮在bfs轉移狀態時維護多種資訊,然後根據題意來決策,比如:【BZOJ】1632: [Usaco2007 Feb]Lilypad Pond(bfs)
繞圈約束:當bfs中要求我們繞一個指定形狀(有且一個連通的)求最短距離,我們可以從這個形狀邊界的點射一條射線出去,然後在bfs後維護兩種方向的bfs,即一種是不經過射線的,一種是從不經過射線的轉移到需要經過射線的。也就是饒了一個圈過來後要繞回去時,我們就要維護後者,比如:【BZOJ】1656:[Usaco2006 Jan]The Grove 樹木(bfs+特殊的技巧)
雙向廣搜:當遇到一種從初始狀態到目標狀態都給你讓你求最小移動步數時,我們可以同時從初始狀態和目標狀態都做bfs,然後判斷是否相交即可。很久以前寫過一題的,不知道哪題了。。
小結:bfs