21xrx.com
2024-11-05 14:36:45 Tuesday
登录
文章检索 我的文章 写文章
【代码分享】C++实现深度优先算法
2023-07-07 04:01:13 深夜i     --     --
代码分享 C++ 深度优先算法 实现 算法

深度优先算法是一种常用的图算法,可以用于查找图中的所有可访问节点。它面向大规模的数据结构和广泛应用于人工智能和图形处理等领域。在这篇文章中,我们将分享C++实现深度优先算法的代码。

实现代码

深度优先算法可以使用递归或非递归的方式实现。下面的代码给出了递归实现的例子:


#include <iostream>

#include <vector>

using namespace std;

void dfs(vector<vector<int>>& adjList, vector<bool>& visited, int node) {

  if (visited[node])

    return;

  

  visited[node] = true;

  cout << node << " ";

  for (int i = 0; i < adjList[node].size(); i++) {

    int nextNode = adjList[node][i];

    dfs(adjList, visited, nextNode);

  }

}

int main() {

  int n, m;

  cin >> n >> m;

  vector<vector<int>> adjList(n);

  vector<bool> visited(n, false);

  for (int i = 0; i < m; i++) {

    int u, v;

    cin >> u >> v;

    adjList[u].push_back(v);

    adjList[v].push_back(u);

  }

  for (int i = 0; i < n; i++) {

    if (!visited[i]) {

      dfs(adjList, visited, i);

    }

  }

  return 0;

}

这段代码使用了一个邻接列表(adjList)来表示图,其中adjList[i]存储了节点i的所有邻居节点。visited[i]表示节点i是否被访问过。在dfs函数中,我们首先检查节点是否已被访问(防止无限递归),然后将节点标记为已访问,并输出节点值。最后,我们递归遍历节点的所有邻居。

演示代码

让我们看看如何使用这段代码来遍历图。假设我们有以下的输入:


5 6

0 1

0 2

1 2

2 3

1 3

3 4

第一行是节点数量n和边数m。接下来m行给出每条边的两个节点。在这个例子中,我们有一个包含五个节点和六条边的简单无向图。

运行代码后,输出如下:


0 1 2 3 4

输出说明我们遍历了所有可达节点,并且按顺序输出了它们的id。

总结

深度优先算法是一种强大的图算法,可以帮助我们解决多种问题,比如遍历图、寻找路径、剪枝等。虽然实现起来有点难度,但我们可以通过递归或非递归的方式完成它。希望本文有助于你更好地了解深度优先算法并开始使用它。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复