图论算法入门:深入理解 DFS 与 BFS 及图树遍历
深度优先搜索 (DFS)
DFS 就像一位执着探索者,它总是沿着一条路径一直走到尽头(叶子节点),然后回溯去尝试其他分支。从数据结构角度看,DFS 依赖栈来实现递归或显式堆栈管理。
在空间复杂度上,DFS 的空间消耗与搜索树的高度成正比,约为 O(h)。由于它是'一条路走到黑'的策略,DFS 并不天然具备寻找最短路的性质,但在处理全排列、组合计数等回溯问题时非常高效。
全排列问题
这是一个经典的 DFS 应用场景。我们需要从 1 到 n 中选取 n 个数进行排列。核心思路是:
- 使用
path数组记录当前路径。 - 使用
st数组标记数字是否已被使用。 - 当层数
u达到n时,说明已选够 n 个数,输出结果并回溯。 - 回溯时恢复现场,将
st[i]重置为 false,以便后续循环使用。
#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;
();
;
}


