含义
- 从搜索起点开始,不断地优先访问当前结点的邻居。常用于搜索最优值
常见所需元素
- 状态
- 状态转移公式
- 有效的状态
- 队列
- 标记
- 有效标记数
- 最优化问题
模板(自创)
void BFS(T xxx){
queue<T> Q;
Q.push(xxx);
while(!Q.empty()){
T temp = Q.front();
Q.pop();
if(f(xxx)...){ //搜到了
cout<<一般是次数<<endl;
return;
}
Q.push(f(xxx)); //转移1
Q.push(f(xxx)); //转移2
}
cout<<没搜到<<endl;
return;
}
优化
- 剪枝:为了防止内存爆炸,已经搜过的就不要搜了,常有两种方式
- 定义bool visit[MAX],然后memset(visit,false,sizeof(visit)) (这玩意在cstring里面)
- 定义map<T,int> ,然后看m.find(xxx)==m.end() (这里的int是搜索次数)
- 对于要输出搜索次数的,可以:
- 定义map<T,int> ,然后用m[xxx]取次数,同时这也可以防止重复搜索
- 定义struct结构体,有两个成员变量,一个是xxx,另一个是次数
例题