加载中…

返回上一页

搜索

搜索分两种,一种是 dfs 爆搜,深度优先遍历;另一种是 bfs,广度优先遍历.

深度优先遍历的基本操作:

  1. 找点
  2. 递归
  3. 回溯
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); }
}

当然这只是一个框架,按照题目要求适时修改.

广度优先遍历的基本操作:

  1. 从队列取点
  2. 把下一个点放入队列
  3. 重复直至队列为空
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(回溯);
  }
}

posted @ 2022-10-05 07:28  1Liu  阅读(8)  评论(0)    收藏  举报