廣度優先搜尋BFS

2021-10-20 19:39:29 字數 2934 閱讀 9898

廣度優先搜尋bfs

廣度優先搜尋(以下簡稱bfs)是搜尋技術中常用的一種搜尋。

bfs體現在廣度一詞上,一層一層進行遍歷,常見的有在矩陣(二維陣列)上的遍歷以及樹和圖的遍歷。體現在二維陣列的遍歷順序如下(假設起點在左上),在只能上下左右四個方向遍歷時,序號代表同一等級的遍歷順序。12

3423

4534

5645

67序號相同的位置訪問順序可任意。實現時,當訪問1號位置時,就要對兩個2號位置進行標記(我要準備訪問你了),當訪問任乙個2號位置時就要標記它能訪問到的3號位置,依次類推。

實現:對於一層一層遍歷的結構,我們使用佇列queue這一先進先出的資料結構。

首先1入隊,遍歷與1相鄰的位置,即兩個2入隊,然後1出隊,然後遍歷與隊尾2相鄰的位置,將其入隊(此時還有乙個2號位置沒遍歷,但是不用擔心,剛入隊的3號位置在隊首,不會影響層層遍歷的光系),隊尾2出隊,此時隊尾仍然是2號位置,此時訪問該2號位置,將與其相鄰且沒遍歷過位置入隊,此時所有的3號位置全部入隊,然後該2號位置出隊。依此遍歷至最後。

對於樹結構的遍歷其實就是對樹結構的層序遍歷,由上往下一層一層進行遍歷。

黑色字型代表結點序號,紅色字型為遍歷層序。

首先遍歷根結點,然後還是兩個2號根結點的葉子結點入隊遍歷方式與矩陣相似。

圖結構的遍歷也類似

//模板

int v[max]

[max]

;//標記陣列,標記某位置是否已經訪問

int dx[4]

=;int dy[4]

=;struct a

root,top;

//結構體表示每乙個位置

void

bfs(

int x,

int y)

//x,y傳入起始位置座標if(

!v[nx]

[ny]

)//未被訪問,入隊等待訪問}}

}

例題:

力扣1293:

網格中的最短路徑

原題鏈結

思考

思路自然是深搜,值得注意的是如果v陣列跟平常一樣只設定二維,可能從一條路徑經過i,j這個點出不去,而此時v[i][j]被標記為訪問過,可能正確***含的路徑卻偏偏包含i,j這個點,這就無法得到正確答案咯;這時我們可以開乙個三維v陣列,表示每次經過該點時經過的障礙點的次數。

ac**:

class

solution

root,top;

int n,m,k;

int ans=

10000

;int dx[4]

=;int dy[4]

=;int a[

100]

[100];

bool v[50]

[50][

1600];

void

bfs()if

(!v[nx]

[ny]

[top.k])}

}}intshortestpath

(vector

int>>

& grid,

int k)

};

多個原始點的搜尋:

洛谷p1332

軍團是乙個n 行m 列的矩陣,每個單元是乙個血色先鋒軍的成員。感染瘟疫的人,每過乙個小時,就會向四周擴散瘟疫,直

到所有人全部感染上瘟疫。你已經掌握了感染源的位置,任務是算出血色先鋒軍的領主們感染瘟疫的時間,並且將它報告給

巫妖王,以便對血色先鋒軍進行一輪有針對性的圍剿.

輸入描述:

第一行:n,m,a,b;表示軍團矩陣有n 行m 列。有 a 個感染源,b 為血色敢死隊中領主的數量。

接下來a行:每行有兩個整數x,y,表示感染源再第x行第y列。

接下來b行:每行兩個整數x,y,表示領主的位置再第x行第y列。

輸出描述:

第1行至第b行:每行乙個整數,表示這個領主感染瘟疫的時間,輸出順序與輸入順序一致。

如果某個人的位置在感染原,那麼他感染瘟疫的時間為0;

#include

using

namespace std;

#define ll long long

const

int max=

5e2+20;

inline

intread()

while

(ch<

'0'||ch>

'9');do

while

(ch>=

'0'&&ch<=

'9')

;return x*f;

}struct a

root,top;

int n,m;

int ans[max]

[max]

;int p[

100000][

3];bool v[max]

[max]

;queueq;

int dx[4]

=;int dy[4]

=;void

bfs()}

}int

main()

for(

int i=

1;i<=b;i++

)bfs()

;for

(int i=

1;i<=b;i++

)return0;

}

BFS廣度優先搜尋

廣度優先搜尋,利用佇列實現,結束標誌是隊列為空的時候 承接dfs的演算法實現的講例,對於迷宮問題我們也可以採取廣度優先搜尋實現 include iostream include cstdio include cstdlib using namespace std int map 55 55 int ...

bfs廣度優先搜尋

這一課我們來學習圖的另一種遍歷方法 廣度優先搜尋 breadth first search,簡稱 bfs 這是一種連通圖的常用遍歷策略,通常用於求起點到各點的最短路徑,以及求兩點之間的最優路徑等問題。首先我們先來看看廣度優先搜尋的具體方法吧 對於乙個連通圖,我們假設一開始所有頂點均未被訪問,廣度優先...

廣度優先搜尋bfs

bfs即廣度優先搜尋演算法,其是搜尋演算法中的一種。1.dfs常用於尋找是否存在解 其從a節點出發,選取乙個臨近點b,然後不斷深入,在搜尋完b的下屬節點 ehif 後,回到a再搜尋臨近a的c節點,以此類推。2.bfs則用於在最短的時間或最少的移動距離內找到解 其往往從a節點出發,搜尋周圍所有的圍繞節...