一、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;
}