广搜BFS

含义

  • 从搜索起点开始,不断地优先访问当前结点的邻居。常用于搜索最优值

常见所需元素

  • 状态
  • 状态转移公式
  • 有效的状态
  • 队列
  • 标记
  • 有效标记数
  • 最优化问题

模板(自创)

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;
}

优化

  1. 剪枝:为了防止内存爆炸,已经搜过的就不要搜了,常有两种方式
    1. 定义bool visit[MAX],然后memset(visit,false,sizeof(visit)) (这玩意在cstring里面)
    2. 定义map<T,int> ,然后看m.find(xxx)==m.end() (这里的int是搜索次数)
  2. 对于要输出搜索次数的,可以:
    1. 定义map<T,int> ,然后用m[xxx]取次数,同时这也可以防止重复搜索
    2. 定义struct结构体,有两个成员变量,一个是xxx,另一个是次数

例题

posted @ 2021-03-14 15:52  LazyXx  阅读(23)  评论(0编辑  收藏  举报