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


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

算法

Begin
function cyclicUtil() :
   a) Mark the current node as visited and part of recursion stack
   b) Recur for all the vertices adjacent to this vertex.
   c) Remove the vertex from recursion stack.
function cyclic() :
   a) Mark all the vertices as not visited and not part of recursion stack
   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;
      // Recur for all the vertices adjacent to this vertex.
      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;
}
//check if the graph is tree or not
bool G::cyclic() {
   //Mark all the vertices as not visited and not part of recursion stack
   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

更新日期: 30-Jul-2019

225 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始
广告