一、bfs是什么?
bfs,广度搜索优先,是层序遍历的一种使用
一般用来求没有边权的情况下的最短路径问题
用队列存储
把题目中的问题情况想象成一颗树(数据类型),根据层次来遍历,找最早时间或路程
一般用队列来完成,比dfs节省很多时间
二、bfs怎么用?
bfs模板
bfs和dfs都是有模板的,一般都是以模板为基础进行编码的
//使用STL中的队列
void BFS()
{
首状态结点入队列Q;
while (!Q.empty()) //队列不空
{
temp=Q.front();
if(到达目的状态)
{
输出结果;
break;
}
Q.pop();
for (i=1; i<=m; i++) //扩展结点temp的m种可能
if (可以扩展)
{
处理每种可能情况;
扩展结点入队列;
}
}
}
当然,题目不可能丝毫不变考模板的,而模板十分局限,只能表明一些思路
简单例题1
题目:鸡飞狗不跳
有一只鸡和一条狗,他们在一条线上,鸡的位置在点N处,狗在点M处,鸡和狗约定,狗站那不动,鸡
去找狗。可以一次向左或向右走一步,也可一次飞到原来所在位置的2倍处。鸡飞一次和走一步时间相
同。为了不让狗等得着急,鸡最快多长时间能到狗的位置。
输入格式:
多组测试数据,每组一行N,M(0<=N,M<=100000).
输出格式:
输出鸡到狗位置的最短时间.
限制:
空间限制:32MByte
时间限制:1秒
样例:
输入:
5 17
输出:
4
这是一个一维的dfs题,也是最简单的一种
代码:
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int n,m;
struct nood{
int x; //记坐标
int step; //记次数
};
int nums[120000];
int bfs(){
queue<nood>q; //队列 用来存nood 里的坐标和每一次的次数
nood root; //第一个节点(根节点)
root.x=n;
root.step=0;
q.push(root);
nums[n]=1; //确保没有走过
while(q.size()){
//层次遍历路径
nood x=q.front();q.pop();
if(x.x==m){
//截止条件
return x.step; //返回截止时的次数
}
int tx=x.x+1; //当鸡往前走时
if(tx>=1&&tx<=110000&&!nums[tx]){
nood p;
nums[tx]=1; //标记已走过
p.x=tx;
p.step=x.step+1;
q.push(p);
}
tx=x.x-1; //当鸡往后走时
if(tx>=1&&tx<=110000&&!nums[tx]){
nood p;
nums[tx]=1;
p.x=tx;
p.step=x.step+1