廣度優先搜尋 BFS遍歷

2021-07-26 20:45:14 字數 1282 閱讀 9598

廣度優先搜尋(breadth first search , bfs)是乙個分層搜尋的過程,沒有回退過程,是非遞迴的。

為避免重複訪問,需要乙個狀態陣列visited[n]來儲存各頂點的訪問狀態。為實現逐層訪問,bfs演算法在實現時需要乙個佇列,以記憶正在訪問的這一層和上一層的頂點,以便於向下一層訪問。

例題(1):營救(rescue)

輸入描述:"."  :道路  "r" :angle的朋友 "#" :牆壁  "x" :警衛

分析:本題要求從r位置出發到達angel所在的位置且所需時間最少,適合bfs求解。但在本題中,步數最少的解不一定是最優解。

為求出最優解,採用如下的思路進行bfs搜尋。

(1)將angel的朋友到達某個方格的狀態用乙個結構體point表示,該結構體包含了angel的朋友到達該方格時所走過的步數及所花費的時間;在bfs搜尋中,佇列中的結點是point型資料.

(2)定義乙個二維陣列mintime,mintime[i][j]表示angel的朋友走到(i,j)位置所需的最少時間;在bfs搜尋過程中,從當前位置走到相鄰的位置(x,y)時,只有當該種走法比走到(x,y)所需的時間更少時,才會把當前走到(x,y)位置的狀態入佇列,否則是不會入佇列的。

(3)不能一判斷出到達目標位置就退出bfs過程,否則求出的最小時間僅僅是從r到達a最小步數的若干方案中的最小時間,不一定是最優解,一定要等到隊列為空,才能得出結論。

另外在題目中未使用visited[n]陣列,因為只有當下乙個位置比上乙個所需的時間少才能入佇列,所以到達(x,y)的最少時間肯定是有下界的。

#include#include#include#include#define maxint 0x3f3f3f3f

#define maxn 200

using namespace std;

struct point

;queueq;

int n,m;

char map[maxn][maxn];

int dir[4][2]=,,,};

int mintime[maxn][maxn];

int ax,ay;///angel所在的位置

int bfs(point s);

int main()

p=p->next;}}

}

(2)用鄰接矩陣儲存圖

dfs(頂點i)

{ visited[i]=1;

將頂點i入佇列;

while(佇列不為空)

{取出佇列頭的頂點,設為k;

for(j=0;j

BFS廣度優先搜尋遍歷

廣度優先搜尋遍歷 problem description 給定乙個無向連通圖,頂點編號從0到n 1,用廣度優先搜尋 bfs 遍歷,輸出從某個頂點出發的遍歷序列。同乙個結點的同層鄰接點,節點編號小的優先遍歷 input 輸入第一行為整數n 0 n 100 表示資料的組數。對於每組資料,第一行是三個整數...

BFS(廣度優先搜尋)遍歷

bfs 廣度優先,結合佇列實現遍歷方式 1.選對乙個入口 2.訪問所有的當前頂點的所有鄰接頂點 3.出隊,找當前頂點鄰接頂點 4.標記已經遍歷節點 5.隊列為null,所有頂點都被訪問 define crt secure no warnings include include include typ...

BFS廣度優先遍歷

樹的層序遍歷即為bfs的應用。實質就是利用乙個佇列將頂點v的鄰接點儲存,因樹的結構比較特殊,所以不需要進行設定flag訪問位,但圖的情況比較複雜,一般需要對每個結點是否被訪問進行標記。利用bfs可以很容易的利用層數求出最短的步數,比如二叉樹利用層序遍歷求樹的高度,但深搜一般也可以實現。廣度優先搜尋能...