图论算法基础
图论是数据结构与算法中的核心章节,主要涉及图的存储、深度优先搜索(DFS)和广度优先搜索(BFS)。本文将结合 C++ 代码,解析这两种遍历方式的核心逻辑、适用场景及优化技巧。
深度优先搜索 (DFS)
DFS 像一位执着探索者,它倾向于沿着一条路径深入到底,直到叶子节点或无法继续为止,然后回溯尝试其他分支。从数据结构角度看,DFS 依赖栈(递归隐式使用系统栈),空间复杂度与搜索深度成正比,约为 O(h)。由于它是'一条路走到头',因此不具备直接求解最短路的性质。
经典案例:全排列问题
通过 DFS 生成 1 到 n 的全排列。我们需要记录当前路径 path 和已访问状态 st。当到达第 n 层时输出结果,回溯时需恢复现场(将 st[i] 重置为 false),而 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);
;
}


