深度优先搜索DFS的C++实现

144 篇文章 8 订阅 ¥39.90 ¥99.00

深度优先搜索DFS的C++实现

深度优先搜索算法是一种用于遍历或搜索树或图的算法,其精髓在于递归求解问题的思路以及回溯的处理。本文将详细介绍用C++语言实现深度优先搜索的过程,并提供完整的源代码。

实现思路

首先,我们需要定义一个图的数据结构。可以用vector容器存储图中每个节点的邻接表。下面的代码定义了一个Node类表示节点:

class Node {
public:
    int id; // 节点的编号
    vector<int> neighbors; // 邻居列表
    bool visited; // 是否已经访问过该节点

    Node(int id) {
        this->id = id;
        visited = false;
    }
};

定义完节点后,需要定义一个函数来实现深度优先搜索。搜索过程中,我们需要对每个节点进行遍历,而每个节点可能联通着其他节点,因此需要用递归的方式进行遍历。为了避免死循环,我们需要记录已经访问过的节点,并在递归时加以判断。

void dfs(Node& node) {
    node.visited = true;
    cout << node.id << " "; // 输出当前节点编号

    // 遍历该节点的邻居
    for (int i = 0; i < node.neighbors.size(); i++) {
        int neighborId = node.neighbors[i];
        Node& neighbor = nodes[neighborId];
        if (!neighbor.visited) {
            dfs(neighbo
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度优先搜索DFS)是一种用于图和树的遍历算法,它按照深度优先的方式进行搜索。在DFS算法中,我们从一个起始节点开始,沿着一条路径一直向下搜索,直到达到最深的节点,然后回溯到上一个节点,继续搜索其他路径,直到找到问题的解或者遍历完所有可能的路径。 以下是一个使用C++实现深度优先搜索算法的示例: ```cpp #include <iostream> #include <vector> using namespace std; // 定义图的邻接表表示 class Graph { private: int V; // 图的顶点数 vector<vector<int>> adj; // 邻接表 public: Graph(int v) { V = v; adj.resize(V); } // 添加边 void addEdge(int u, int v) { adj[u].push_back(v); adj[v].push_back(u); } // 深度优先搜索 void DFS(int v, vector<bool>& visited) { visited[v] = true; cout << v << " "; // 递归访问邻接节点 for (int i = 0; i < adj[v].size(); i++) { int u = adj[v][i]; if (!visited[u]) { DFS(u, visited); } } } // 对图进行深度优先搜索 void DFS() { vector<bool> visited(V, false); // 记录节点是否被访问过 // 从每个未被访问的节点开始进行DFS for (int v = 0; v < V; v++) { if (!visited[v]) { DFS(v, visited); } } } }; int main() { // 创建一个包含5个节点的图 Graph g(5); // 添加边 g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 3); g.addEdge(1, 4); // 对图进行深度优先搜索 cout << "DFS traversal: "; g.DFS(); return 0; } ``` 输出结果为: ``` DFS traversal: 0 1 3 4 2 ``` 这是一个简单的深度优先搜索算法的示例,它通过邻接表表示图,并从每个未被访问的节点开始进行深度优先搜索。在搜索过程中,我们使用一个visited数组来记录节点是否被访问过,以避免重复访问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值