关于c++深度优先遍历

C++深度优先遍历

深度优先遍历(Depth-First Search,DFS)是一种重要的图遍历算法,它可以用于解决很多问题,例如连通性问题、路径问题、生成树问题等。在C++中,我们可以使用递归或栈来实现深度优先遍历。

递归实现深度优先遍历

递归实现深度优先遍历是一种简单而直观的方法。我们可以从一个起始节点开始,递归地访问其相邻节点,直到所有节点都被访问过。下面是一个简单的C++代码示例:

```
#include <iostream>
#include <vector>
using namespace std;

void dfs(int node, vector<vector<int>>& graph, vector<bool>& visited) {
    visited[node] = true;
    cout << node << " ";
    for (int i = 0; i < graph[node].size(); i++) {
        int next = graph[node][i];
        if (!visited[next]) {
            dfs(next, 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);
    dfs(0, graph, visited);
    return 0;
}
```

在上面的代码中,我们使用了一个visited数组来记录每个节点是否被访问过。在dfs函数中,我们首先将当前节点标记为已访问,并输出其值。然后遍历当前节点的所有相邻节点,如果相邻节点未被访问过,则递归地访问它。

栈实现深度优先遍历

除了递归,我们还可以使用栈来实现深度优先遍历。栈实现深度优先遍历的基本思路是:从起始节点开始,将其入栈,然后弹出栈顶元素并访问它,将其未访问的相邻节点入栈,重复这个过程直到栈为空。下面是一个使用栈实现深度优先遍历的C++代码示例:

```
#include <iostream>
#include <vector>
#include <stack>
using namespace std;

void dfs(int start, vector<vector<int>>& graph, vector<bool>& visited) {
    stack<int> s;
    s.push(start);
    visited[start] = true;
    while (!s.empty()) {
        int node = s.top();
        s.pop();
        cout << node << " ";
        for (int i = 0; i < graph[node].size(); i++) {
            int next = graph[node][i];
            if (!visited[next]) {
                visited[next] = true;
                s.push(next);
            }
        }
    }
}

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);
    dfs(0, graph, visited);
    return 0;
}
```

在上面的代码中,我们使用了一个栈来存储待访问的节点。在dfs函数中,我们首先将起始节点入栈,并标记为已访问。然后,当栈不为空时,弹出栈顶元素并访问它,将其未访问的相邻节点入栈。

总结

深度优先遍历是一种重要的图遍历算法,它可以用于解决很多问题。在C++中,我们可以使用递归或栈来实现深度优先遍历。无论是递归还是栈,都需要使用一个visited数组来记录每个节点是否被访问过。在实际应用中,我们需要根据具体问题选择适合的实现方式。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值