廣度優先搜尋演算法(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是一種完備策略,即只要問題有解,它就一定可以找到解。並且,廣度優先搜尋找到的解,還一定是路徑最短的解。但是它盲目性較大,尤其是當目標節點距...