一、BFS的介紹
BFS(廣度優先搜索,也可稱寬度優先搜索)是連通圖的一種遍歷策略。因爲它的基本思想是從一個頂點V0開始,輻射狀地優先遍歷其周圍較廣的區域。
廣度優先搜索(BFS)類似於二叉樹的層序遍歷算法,它的基本思想是:首先訪問起始頂點v,然後由v出發,依次訪問v的各個未被訪問過的鄰接頂點w1,w2,w3….wn,然後再依次訪問w1,w2,…,wi的所有未被訪問過的鄰接頂點,再從這些訪問過的頂點出發,再訪問它們所有未被訪問過的鄰接頂點….以此類推,直到途中所有的頂點都被訪問過爲止。類似的想法還將應用與Dijkstra單源最短路徑算法和Prim最小生成樹算法。
廣度優先搜索是一種分層的查找過程,每向前走一步可能訪問一批頂點,不像深度優先搜索(DFS)那樣有回退的情況,因此它不是一個遞歸的算法,爲了實現逐層的訪問,算法必須藉助一個輔助隊列並且以非遞歸的形式來實現。
二、BFS搜索的步驟
1、首先創建一個visit[ ]數組和一個隊列q,分別用來判斷該位置是否已經訪問過及讓未訪問過的點入隊;
2、初始化visit[ ]數組,清空q隊列;
3、讓起點start入隊,並使該點的visit置1;
4、while(!q.empty()){......}執行搜索操作,
a、取出隊頭元素後使隊頭元素出隊,判斷該元素是否爲目標到達點;
b、如果是目標點,就返回結果(一般是最短時間、最短路徑);
c、如果不是目標點,就繼續訪問與其相鄰的位置點,將可走的相鄰的位置點入隊,並更新visit[ ]數組;
三、BFS的應用
BFS算法一般應用於單源最短路徑的搜索。
1、尋找非加權圖(或者所有邊權重相同)中任兩點的最短路徑。
2、尋找其中一個連通分支中的所有節點。(擴散性)
3、bfs染色法判斷是否爲二分圖。
四、核心代碼
#include<iostream>
#include<queue>
#include<string.h>
#define maxn 105
using namespace std;
int n,m;
int sx,sy;
int vis[maxn][maxn],s[maxn][maxn],t[maxn][maxn];
queue<struct node>Q;
int px[]={1,-1,0,0};
int py[]={0,0,1,-1};
struct node{
int x,y,step;
}r,p,q;
int BFS()
{
while(!Q.empty())
Q.pop();
memset(vis,0,sizeof(vis));
p.x=sx;
p.y=sy;
p.step=0;
vis[p.x][p.y]=1;
Q.push(p);
while(!Q.empty())
{
p=Q.front();
Q.pop();
if(s[p.x][p.y]=='t')
return p.step;
for(int i=0;i<4;i++)
{
q=p;
q.x+=px[i];
q.y+=py[i];
q.step++;
if(q.x<0||q.y<0||q.x>=n||q.y>=m)
continue;
if(vis[q.x][q.y]==0&&q.step<t[q.x][q.y])
{
vis[q.x][q.y]=1;
Q.push(q);
}
}
}
return -1;
}
int main(){
return 0;
}