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; //记录父亲
}
}
}
}