1.BFS与DFS的区别
1.1 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 1000
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++;
int f=q[head];
//3.2 判断父亲是不是答案
if(/* f是答案*/)
{
//输出答案
break;
}
//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(/*父亲是答案*/)
{
//输出答案
break;
}
//3.3 出队入队操作
for(int i=1;i<=n;i++)
{
//生成孩子v
if(/*孩子合法*/)
{
q.push(v);
vis[v]=1 ;
father[v]=u;
}
}
}
}