DFS/BFS 专项练习:从海岛问题掌握图论基础
图论遍历主要依赖深度优先搜索(DFS)与广度优先搜索(BFS)。理解这两种遍历方式的区别,是解决图论问题的基石。
DFS 与 BFS 的核心区别
- DFS(深度优先):优先不断向下探索。不到绝境不回头,到达尽头后回溯到原位置,换方向继续遍历。适合路径查找、连通性判断。
- BFS(广度优先):优先遍历与本节点相连的所有节点。遍历完一层再进入下一层。适合最短路径、层级遍历。
掌握知识点不能只靠概念,必须通过实战来巩固。接下来我们结合邻接表与邻接矩阵,用代码实战一下。
DFS(深度优先搜索)
通用模版
void dfs(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本节点相连的其他节点) {
处理节点;
dfs(图,选择的节点);
回溯,撤销处理的结果;
}
}
实战例题:所有可达路径
题目描述:给定一个有 n 个节点的有向无环图,找出并返回所有从节点 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 = ; i <= n; ++i) {
(arr[k][i] == ) {
cur.(i);
(i, n);
cur.();
}
}
}
{
n, m;
cin >> n >> m;
( 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;
}
}
;
}


