BFS算法

 1. BFS和DFS的算法

1.1 DFS是枪挑一条线,BFS是棍扫一大片,DFS是按枝搜索,BFS是按层搜索

1.2 DFS使用的栈(是隐式的栈,先进后出,后进先出),BFS使用的是队列(先进先出,后进后出)

1.3 通常DFS可以找到所有的路径,BFS可以找到最短路径

2. BFS和DFS的共同点

2.1 重点考虑父亲和孩子的关系,即父亲可以找到所有的孩子(父亲出栈,合法的孩子入栈;父亲出队,合法的孩子入队;)

2.2 重点考虑孩子的合法性,即孩子的重复性和是否满足约束条件

2.3 DFS使用的必要变量 vis[],ans[],BFS的使用的必要变量vis[],father[];

3.BFS的两种实现方式

3.1 使用普通数组实现队列

#include<bits/stdc++.h>
using namespace std;
#define N 100;
void BFS(int start); 
int main()
{
	
	return 0;
}
void BFS(int start)
{
	//1.初始化队列
	int q[N];//定义队列
	int vis[N];//定义标记
	int father[N];//记录父亲
	int head=0;//头指针 
	int tail=1;//尾指针 
	memset(q,0,sizeof(q));
	memset(vis,0,sizeof(vis));
	memset(father,0,sizeof(father));
	//2.根节点入队(起点入队)
	q[tail]=start;
	vis[start]=1;
	//3.出队入队操作
	while(head<tail)
	{
		//3.1 父亲出队
		head ++;
		f=q[head];
		//3.2 判断父亲是不是答案
		if(/*父亲是答案*/)
		{
			//输出答案 
		}
		//3.3 孩子入队
		for(int i=1;i<=n;i++)//枚举所有孩子 
		{
			//生成孩子
			if(/*孩子合法*/)
			{
				//孩子入队
				tail ++;
				q[tail]=孩子;
				vis[孩子]=1;
				father[孩子]=f; 
			} 
		} 
	} 
}

3.2 使用STL实现队列(推荐使用)

#include<bits/stdc++.h>
using namespace std;
void BFS(int start); 
int main()
{

	return 0;
}
void BFS(int start)
{
	//1.初始化队列  
	queue<int> q; //定义队列 
	int vis[N];
	int father[N];
	memset(vis,0,sizeof(vis));
	memset(father,0,sizeof(father));
	//2.根节点入队或起点入队
	q.push(start);
	vis[start]=1;
	//3.出队入队操作 
	while(!q.empty())
	{
		//3.1父亲出队
		int u=q.front();
		q.pop();
		//3.2判断父亲是不是答案
		if(/*u是答案*/)
		{
			//输出答案
			break; 
		}
		//3.3合法孩子入队
		for(int i=1;i<=n;i++)
		{
			//生成孩子v 
			if(/*孩子合法*/)
		    {
				q.push(v); //孩子入队 
				vis[v]=1; //标记孩子已入队 
				father[v]=u; //记录父亲 
		    }
		}	
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值