深度优先搜索(DFS)和广度优先搜索(BFS)是图论中最基础的两种遍历方式。理解它们的区别,关键在于探索策略:DFS 倾向于一条路走到黑,遇到死胡同再回溯;BFS 则像水波扩散,先访问所有相邻节点,再逐层深入。
在实现之前,我们需要选择图的存储结构。邻接矩阵适合稠密图,查询边是否存在只需 O(1);邻接表更适合稀疏图,节省空间且遍历邻居更高效。下面我们通过具体案例来实战这两种结构下的 DFS 与 BFS。
DFS 基础与路径查找
模板思路
DFS 的核心在于递归与回溯。基本逻辑是:标记当前节点 -> 遍历邻居 -> 递归调用 -> 撤销标记(回溯)。
例题:所有可达路径
给定一个有向无环图,找出从节点 1 到节点 n 的所有路径。
邻接矩阵实现:
#include <iostream>
#include <vector>
using namespace std;
const int N = 105;
int arr[N][N]; // 邻接矩阵
vector<int> cur; // 当前路径
vector<vector<int>> res; // 结果集
void dfs(int k, int n) {
if (k == n) {
res.emplace_back(cur);
return;
}
for (int i = 1; i <= n; ++i) {
if (arr[k][i] == 1) {
cur.emplace_back(i);
dfs(i, n);
cur.pop_back(); // 回溯
}
}
}
int main() {
int n, m;
cin >> n >> m;
for (int i = ; i < m; ++i) {
x, y;
cin >> x >> y;
arr[x][y] = ;
}
cur.();
(, n);
(res.()) {
cout << << endl;
} {
(& vec : res) {
( i = ; i < vec.() - ; ++i) {
cout << vec[i] << ;
}
cout << vec.() << endl;
}
}
;
}


