搜索
搜索分两种,一种是 dfs 爆搜,深度优先遍历;另一种是 bfs,广度优先遍历.
深度优先遍历的基本操作:
- 找点
- 递归
- 回溯
dfs(int x)
{
if(搜索到终点) { 累加答案; return; }
for(遍历x后面元素i) { flag[i]=1; dfs(i); flag[i]=0(回溯); }
}
对于图:
dfs(int x,int fa)
{
for(i=head[x];i;i=e[i].next) { int to=e[i].to; if(to==fa) continue; dfs(to); }
}
当然这只是一个框架,按照题目要求适时修改.
广度优先遍历的基本操作:
- 从队列取点
- 把下一个点放入队列
- 重复直至队列为空
queue< int > q;
bfs(int x)
{
q.push(起始点);
while(!q.empty())
{
int t=q.front();q.pop();
for(遍历t后面元素i) if(未搜索过) q.push(i);
}
}
对于图的话也是一样的,不写了.
深度优先遍历和广度优先遍历的复杂度是差不多的. 因此在实际选择中,通常考虑适时选择(如路径用深搜、最小值用广搜).
这样太慢,那么搜索就需要剪枝.
剪枝就是把在前面已经不符合条件的情况停止递归,因为就算计算了也是对答案没有贡献的,这样就可以使无效的递归次数减少,从而达到节省运行时间的效果.
dfs(int x)
{
if(搜索到终点) { 累加答案; return; }
for(遍历x后面元素i)
{
if(不合法或者无贡献) continue;
flag[i]=1; dfs(i);
flag[i]=0(回溯);
}
}
--END--

浙公网安备 33010602011771号
我的博客: 𝟷𝙻𝚒𝚞
本文链接: https://www.cnblogs.com/1Liu/articles/16754999.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!