C ++程序检查有向图是否为树或不使用DFS

如果图形不包含任何循环,则它是一棵树。这是一个使用DFS检查有向图是否为树的C ++程序。

算法

Begin

function cyclicUtil() :

   a) Mark the current node as visited and part of recursion stack

   b)为与该顶点相邻的所有顶点递归。

   c) Remove the vertex from recursion stack.

function cyclic() :

   a) 将所有顶点标记为未访问且不属于递归堆栈

   b) Call the CyclicUtill() function to detect cycle in different trees

End

示例

#include<iostream>

#include <list>

#include <limits.h>

using namespace std;

class G {

   int n;

   list<int> *adj; //contain adjacent list.

   bool CyclicUtil(int v, bool visited[], bool *rs);

   public:

      G(int V); // Constructor

      void addEd(int v, int w);

      bool cyclic();

};

G::G(int n) {

   this->n = n;

   adj = new list<int> [n];

}

void G::addEd(int v, int u) //to add edges in the graph {

   adj[v].push_back(u); //add u to v’s list

}

bool G::CyclicUtil(int v, bool visited[], bool *recurS) {

   if (visited[v] == false) {

      visited[v] = true; //Mark the current node as visited and part of recursion stack

      recurS[v] = true;

      //为与该顶点相邻的所有顶点递归。

      list<int>::iterator i;

      for (i = adj[v].begin(); i != adj[v].end(); ++i) {

         if (!visited[*i] && CyclicUtil(*i, visited, recurS))

            return true;

         else if (recurS[*i])

            return true;

      }

   }

   recurS[v] = false; //Remove the vertex from recursion stack.

   return false;

}

//检查图是否为树

bool G::cyclic() {

   //将所有顶点标记为未访问且不属于递归堆栈

   bool *visited = new bool[n];

   bool *recurS = new bool[n];

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

      visited[i] = false;

      recurS[i] = false;

   }

   // Call the CyclicUtill() function to detect cycle in different trees

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

      if (CyclicUtil(i, visited, recurS))

         return true;

         return false;

}

int main() {

   G g(4);

   g.addEd(0, 2);

   g.addEd(1, 2);

   g.addEd(2, 0);

   g.addEd(3, 2);

   if (g.cyclic())

      cout << "Directed Graph isn't a tree";

   else

      cout << "Directed Graph is a tree";

      return 0;

}

输出结果

Directed Graph isn't a tree

以上是 C ++程序检查有向图是否为树或不使用DFS 的全部内容, 来源链接: utcz.com/z/338246.html

回到顶部