C++——dfs

dfs,即深度优先遍历,通过调用递归函数实现

03-08
### C++ 中深度优先搜索 (DFS) 算法实现 #### 使用栈实现 DFS 的基本原理 在 C++ 中,可以利用标准库中的 `stack` 容器来模拟递归调用的过程。这种方法特别适合处理那些不适合直接使用函数递归的情况,比如防止因递归层数过多而导致的堆栈溢出。 ```cpp #include <iostream> #include <vector> #include <stack> using namespace std; void dfs(int start, vector<vector<int>>& adjList, vector<bool>& visited) { stack<int> s; s.push(start); while (!s.empty()) { int node = s.top(); s.pop(); if (!visited[node]) { cout << "Visit Node: " << node << endl; // 访问当前结点 visited[node] = true; for (auto& neighbor : adjList[node]) { // 将邻接点压入栈中 if (!visited[neighbor]) s.push(neighbor); } } } } ``` 这段代码展示了如何基于栈数据结构执行非递归形式的深度优先搜索[^1]。这里定义了一个名为 `dfs` 函数接收三个参数:起点索引、邻接表表示的图以及布尔型数组标记哪些顶点已经被访问过了。 #### 递归方式下的 DFS 实现 除了迭代版本外,在许多情况下也可以采用更加简洁直观的方法——即通过递归来完成相同的功能: ```cpp void recursiveDfs(int currentNode, const vector<vector<int>>& graph, vector<bool>& seenNodes) { if (seenNodes[currentNode]) return; cout << "Visiting node: " << currentNode << "\n"; seenNodes[currentNode] = true; for (int nextNode : graph[currentNode]) { recursiveDfs(nextNode, graph, seenNodes); } } ``` 此段程序同样实现了对给定无向连通图进行遍历操作,并打印出所经过的所有节点编号;不同之处在于它是借助编译器内部维护的一个隐式的运行期栈来进行工作的[^3]。 #### 关于 DFS 特性的说明 值得注意的是,相比于其他类型的图形遍历方法而言,DFS 具有如下特点: - **实现简便**:无论是显式还是隐式地运用栈机制都可以轻松构建起完整的解决方案; - **空间效率高**:由于只需记录一条从根至叶路径上的各层状态即可满足需求,故而整体所需额外存储资源较少[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值