21xrx.com
2024-09-20 05:48:52 Friday
登录
文章检索 我的文章 写文章
C++深度优先算法代码实现
2023-06-30 19:32:12 深夜i     --     --
C++ 深度优先算法 代码实现

深度优先算法(Depth First Search,DFS)是图论中常用的算法之一,主要用于遍历和搜索图中所有节点。C++作为一种强大且高效的编程语言,可以轻松地实现深度优先算法。下面将介绍如何使用C++实现深度优先算法。

深度优先算法简介

深度优先算法是一种遍历图的算法,其核心思想是从图的某个节点开始,通过不断深入图中的下一个未访问节点,直到该节点无法再深入为止。一旦到达终止节点,算法将返回上一个节点,重复上述步骤,直到遍历完所有节点。

C++实现深度优先算法

1. 创建图

首先,我们需要创建一个图。可以使用向量、数组或邻接列表等数据结构来表示图。为了简化代码,我们使用邻接列表来表示图。

例如,以下代码创建一个有7个节点的无向图:


vector<int> adjList[7];

//图节点和连接的节点

adjList[0].push_back(1);

adjList[0].push_back(2);

adjList[1].push_back(0);

adjList[1].push_back(2);

adjList[1].push_back(3);

adjList[2].push_back(0);

adjList[2].push_back(1);

adjList[2].push_back(3);

adjList[2].push_back(4);

adjList[3].push_back(1);

adjList[3].push_back(2);

adjList[3].push_back(4);

adjList[3].push_back(5);

adjList[4].push_back(2);

adjList[4].push_back(3);

adjList[4].push_back(5);

adjList[4].push_back(6);

adjList[5].push_back(3);

adjList[5].push_back(4);

adjList[6].push_back(4);

2. 实现深度优先算法

在C++中,深度优先算法可以使用递归实现。以下是使用递归的深度优先算法实现代码:


void DFSRec(int node, vector<int> adjList[], bool visited[]) {

  visited[node] = true; // 标记该节点已被访问

  cout << node << " "; // 打印该节点

  // 遍历该节点连接的所有节点

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

    int adjNode = adjList[node][i];

    // 如果该节点未被访问,则递归访问该节点

    if (!visited[adjNode]) {

      DFSRec(adjNode, adjList, visited);

    }

  }

}

以上代码使用一个布尔类型的visited数组来跟踪哪些节点已被访问过。当访问节点时,我们将该节点标记为已访问,并通过递归方式遍历与该节点相邻的所有未访问节点。

3. 运行算法

为了运行上述代码,我们需要创建一个visited数组并将所有节点初始化为未访问状态。我们还需要调用DFSRec()函数,从图中任何节点开始遍历。

例如,以下代码从节点0开始遍历上面创建的无向图:


bool visited[7] = {false};

DFSRec(0, adjList, visited);

以上代码将遍历所有与节点0相连的节点,并最终遍历整个图。

总结

深度优先算法是一种非常常用的算法,可以用于遍历或搜索图中的所有节点。C++作为一种强大且高效的编程语言,可以轻松地实现深度优先算法。根据以上步骤,您可以创建一个图和运行深度优先算法。

  
  

评论区

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