图论算法基础:深入理解 DFS 与 BFS 遍历
DFS(深度优先搜索)
DFS 的核心思想是'一条路走到黑'。它利用栈结构,尽可能深地搜索树的分支。当到达叶子节点或无法继续时,才会回溯到上一个节点尝试其他路径。
从数据结构来看,DFS 使用栈。空间复杂度与树的高度成正比,即 O(h)。由于 DFS 倾向于深度探索,它并不保证能找到最短路径。
全排列问题
这是一个经典的回溯应用。我们从 0 开始出发,往下搜索,当搜到第 n 层时说明已选够 n 个数,输出路径即可。搜索完成后需要恢复现场,将 st 数组标记还原。注意 path 数组不需要手动清空,因为下一次循环会直接覆盖旧值。
这里的 u 代表当前层数,每一层选择一个数字,直到第 n 层完成选择。
#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);
;
}


