图论是算法领域的基石,而 DFS 和 BFS 则是处理图与树结构最核心的两种遍历策略。
DFS:深度优先搜索
DFS 像一位执着的探索者,它总是沿着一条路径一直走到尽头(叶子节点),然后再回溯去尝试其他分支。从数据结构角度看,DFS 依赖栈来实现递归或显式栈操作。其空间复杂度通常与树的高度成正比,即 O(h)。需要注意的是,由于 DFS 优先深入而非广度扩展,它并不具备直接求解最短路的性质。
全排列问题
这是一个经典的回溯应用场景。我们从第 0 层开始搜索,当搜到第 n 层时说明已经选够了 n 个数,此时输出路径即可。关键在于'恢复现场':在递归返回后,必须将标记数组 st 重置为未访问状态,以便后续分支能复用该数字。注意 path 数组不需要手动清空,因为下一次循环会直接覆盖旧值。
#include <iostream>
using namespace std;
const int N = 10;
int n;
int path[N];
bool st[N];
void dfs(int u){
if(u == n){
for(int i = 0; i < n; i++) printf("%d ", path[i]);
puts("");
return;
}
for(int i = 1; i <= n; i++){
if(!st[i]){
path[u] = i;
st[i] = true;
dfs(u + 1);
// 恢复现场
st[i] = false;
}
}
}
int main(){
cin >> n;
dfs(0);
return 0;
}


