dfs c++模板
时间: 2025-05-23 19:47:17 浏览: 12
### C++ 中的深度优先搜索(DFS)代码模板
以下是基于邻接表实现的一个通用的深度优先搜索(DFS)算法模板,适用于无向图或有向图:
```cpp
#include <iostream>
#include <vector>
using namespace std;
void dfs(int node, vector<vector<int>>& graph, vector<bool>& visited) {
if (visited[node]) return; // 如果节点已被访问,则跳过
visited[node] = true; // 标记当前节点为已访问
cout << "Visiting Node: " << node << endl; // 处理当前节点逻辑
for (auto& neighbor : graph[node]) { // 遍历相邻节点
if (!visited[neighbor]) { // 若未访问邻居节点,则递归调用 DFS
dfs(neighbor, graph, visited);
}
}
}
int main() {
int n, m;
cin >> n >> m; // 输入节点数和边数
vector<vector<int>> graph(n); // 使用邻接表存储图结构
for (int i = 0; i < m; ++i) {
int u, v;
cin >> u >> v; // 输入每条边连接的两个节点
graph[u].push_back(v); // 添加到邻接表中
graph[v].push_back(u); // 对于无向图需双向添加
}
vector<bool> visited(n, false); // 初始化访问状态数组
for (int i = 0; i < n; ++i) { // 遍历所有节点以处理不连通的情况
if (!visited[i]) {
dfs(i, graph, visited); // 对每个未访问过的节点执行 DFS
}
}
return 0;
}
```
#### 关键点说明
1. **输入部分**:程序通过标准输入读取节点数量 `n` 和边的数量 `m`,并构建图的邻接表表示形式[^2]。
2. **DFS 函数定义**:函数接受三个参数——当前节点编号、图的邻接表以及访问标志数组。它会递归遍历所有可达节点,并标记它们作为已访问的状态。
3. **全局遍历**:为了应对可能存在的多个连通分量,在主循环中对每一个尚未被访问的节点都启动一次新的 DFS。
此模板的时间复杂度通常为 \(O(V+E)\),其中 \(V\) 是顶点数目而 \(E\) 表示边的数量;其空间需求主要取决于递归栈大小与辅助数据结构所占用的空间,理论上可以达到 \(O(V)\)[^1]。
阅读全文
相关推荐

















