廣度優先搜尋

2021-07-11 06:17:42 字數 4025 閱讀 9585

廣度優先搜尋演算法(breadth first search),又稱為」寬度優先搜尋」或」橫向優先搜尋」,簡稱bfs。

演算法思想:從圖中某頂點v出發,在訪問了v之後依次訪問v的各個未曾訪問過的鄰接點,然後再分別從這些鄰接點出發依次訪問它們的鄰接點(鄰接節點的鄰接節點)。

換句話說,廣度優先搜尋遍歷圖的過程是以v為起點,由近至遠,依次訪問和v有路徑相通且路徑長度為1,2…的頂點。

下面以」無向圖」為例,來對廣度優先搜尋進行演示。

第1步:訪問a(起始節點)。

第2步:依次訪問c,d,f(都是a的鄰接點)。

在訪問了a之後,接下來訪問a的鄰接點。為了形象的描述,我們假設該無向圖用鄰接矩陣表示(如下),a所在的行中為1的部分表示與節點a有直接聯絡,是a的鄰接點。那麼就可以按照訪問一維陣列一樣,從左到右依次a所在的行,通過標識1來判斷是否為a的鄰接點。由此,便產生了乙個訪問了順序,所以在a的鄰接點中,訪問順序是c-d-f。

第3步:依次訪問b,g。

在第2步訪問完c,d,f之後,再依次訪問它們的鄰接點。首先訪問c的鄰接點b,再訪問f的鄰接點g(程式中可以依次遍歷c所在的行和f所在的行)。

第4步:訪問e。

在第3步訪問完b,g之後,再依次訪問它們的鄰接點。只有g有鄰接點e,因此訪問g的鄰接點e。

因此訪問順序是:a -> c -> d -> f -> b -> g -> e

下面以」有向圖」為例,來對廣度優先搜尋進行演示。

第1步:訪問a(起始點)。

第2步:訪問b(a的鄰接點)。

第3步:依次訪問c,e,f(b的鄰接點)。

在訪問了b之後,接下來訪問b的出邊的另乙個頂點,即c,e,f。判斷過程跟上述無向圖的一樣,就是通過訪問鄰接矩陣中的b行。

第4步:依次訪問d,g。

在訪問完c,e,f之後,再依次訪問它們的出邊的另乙個頂點。還是按照c,e,f的順序訪問,c的已經全部訪問過了,那麼就只剩下e,f;先訪問e的鄰接點d,再訪問f的鄰接點g。

因此訪問順序是:a -> b -> c -> e -> f -> d -> g

求任意兩個節點之間的最短距離。

bfs.h

#ifndef _bfs_h_

#define _bfs_h_

struct node

;// 廣度優先搜尋

class bfs

;#endif

bfs.cpp

#include "bfs.h"

#include "string.h"

#include

using

namespace

std;

bfs::bfs(int (*arr)[100]/* = nullptr */, int nod /* = 0 */)

void bfs::handle(int beg, int tar)

if (que[tail-1].iorder == tar) // 判斷是否已經到達目的點

}if (flag)

head++;

}cout

<< que[tail - 1].idisten << endl;

delete que;

delete visited;

}

測試**:

#include // for cout

#include // for memset

#include "bfs.h"

#define n 100

using

namespace

std;

int city_n; //城市的數量

int road_n; //道路的數量

int mindis = -1; //最短路程 -1 表示此數值無效

int visited[n]; //已經路過的城市

int edge[n][n]; //鄰接矩陣 : -1 表示此路不通

int city_tar; //目標城市

int main()

cout

<< "輸入城市之間的道路情況【eg : 1 2 8 城市1到2的路程為8】"

<< endl;

int city_s, city_d; //路的起始城市,和 目的城市

for (int i = 0; i < road_n; i++)

/* 輸入出發點 和 目標點 */

int city_cur;

cout

<< "輸入出發點 和 目標點【eg : 1 5 從城市1出發到城市5】"

<< endl;

bfs bfs(edge,city_n);

while (true)

bfs.handle(city_cur, city_tar);

}return

0;}

測試資料

5

7//5 個節點 7條路12

1323

2434

3545

測試結果:

以下是乙個迷宮的示意圖,標有1的空格表示為障礙物,要求從起始位置到目的位置的最短步數。注意:每次只能在當前位置向上下左右四個方向移動一格,要求只能在迷宮內移動,並且遇到障礙物只能繞道而行。

**如下:

#include 

#include

#include

using

namespace

std;

struct info

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

info que[2501];

intmap[51][51];

int visited[51][51];

int row;

int col;

int tarx,tary;

void mazebfs(int x,int y) //起始位置(x,y)}}

if(flag == 1)

head++;

}cout

<< que[tail-1].dis

}int main()

}cout

<< "input start pos(x,y) & target pos(x,y) "

cin >> sx >> sy >> tarx >> tary;

mazebfs(sx,sy);

return

0;

}

測試資料:

5 4

0 0 1 0

0 0 0 0

0 0 1 0

0 1 0 0

0 0 0 1

1 1 4 3

測試結果:

搜尋 廣度優先搜尋

廣度優先搜尋一層一層地進行遍歷,每層遍歷都是以上一層遍歷的結果作為起點,遍歷乙個距離能訪問到的所有節點。需要注意的是,遍歷過的節點不能再次被遍歷。class solution,int shortestpathbinarymatrix vectorint grid length return 1 cl...

廣度優先搜尋

include include include include using namespace std struct node 圖頂點結構定義 typedef struct node graph 圖形的結構新型態 struct node head 9 圖形頂點陣列 int visited 9 遍歷標...

廣度優先搜尋

廣度優先搜尋詳解 1.也稱寬度優先搜尋,顧名思義,就是將一棵樹一層一層往下搜。演算法首先搜尋和s距離為k的所有頂點,然後再去搜尋和s距離為k l的其他頂點。bfs是一種完備策略,即只要問題有解,它就一定可以找到解。並且,廣度優先搜尋找到的解,還一定是路徑最短的解。但是它盲目性較大,尤其是當目標節點距...