总结——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 操作,而后者直接给了一张图,直接用搜索遍历即可。
例题: