总结——DFS && BFS

深度优先搜索广度优先搜索

 

1. 思路

  深度优先搜索伪代码:

void dfs(状态A){
    if  (A不合法)  return;
    if  (A为目标状态)  输出;
    if  (A不为目标状态)  dfs(A+x);
}

 

  广度优先搜索伪代码:

queue<int> Q;
Q.push(head) while (!Q.empty()){ temp=Q.front(); Q.pop; if (temp为目标状态) 输出; if (temp不合法) continue; if (temp合法) Q.push(x);//x表示temp在搜索树中的所有子节点 }

 

2. 适用范围——如何判断用深搜还是广搜?

  DFS:可以不重不漏枚举所有可达目标状态的路径。

  BFS:效率高,适用于找最快到达目标状态的路径。占用空间大。

  ① “最快”、“最短”、“最近”——广搜

  ② 没有深度限制,深搜可能永远搜不到头——广搜

 

3. 搜索?并查集?

  不论是BFS/DFS还是并查集都可以处理连通分量的问题,所以面对题目选择哪一种解决方法容易被混淆。

  以 HUD1232 畅通工程 和 SDUT 2152 Balloons 为例。畅通工程题目中给的是通路,所以使用二维数组标记边连通;而 Balloons 题目中直接给出点的矩阵。前者给了一条路相当于给了一张图的邻接矩阵,所以采用并查集更合适,可以直接对邻接的边使用并查集的 find 和 join 操作,而后者直接给了一张图,直接用搜索遍历即可。

 

例题:

 

LeetCode 17

 

posted @ 2018-04-11 12:00  Travelller  阅读(204)  评论(0编辑  收藏  举报