图论算法基础
深度优先搜索 (DFS)
DFS 的核心思想是'一条路走到黑',直到无法继续才回溯。从数据结构看,它依赖栈(递归隐式调用栈),空间复杂度为 O(h)。由于它是深度优先的,通常不直接用于求最短路。
全排列问题
通过递归枚举每个位置可选的数字,配合 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;
}
N 皇后问题
引入剪枝优化,利用对角线特性减少无效搜索。正对角线和反对角线的索引计算需注意偏移量,防止越界。





