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

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

算法

Begin
function cyclicUtil() :
   A) Mark the current node as visited.
   B)为与该顶点相邻的所有顶点递归.
   C) If an adjacent is not visited, then recur for that adjacent.
   D)如果访问了相邻节点而不是当前顶点的父节点,则存在一个循环。
End
Begin
function cyclic():
   A) Mark all the vertices as not visited and not part of recursion stack.
   B) Call the recursive function cyclicUtil() to detect cycle in differentDFS trees.
End

示例

#include<iostream>
#include <list>
#include <limits.h>
using namespace std;
class G {
   int n;
   list<int> *adj;
   bool CyclicUtil(int v, bool visited[], int par);
   public:
      G(int n); //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
   adj[u].push_back(v);//add v to u’s list
}
//recusive函数使用visited []检测可从顶点v到达的子图中的循环:
bool G::CyclicUtil(int v, bool visited[], int par) {
   visited[v] = true; // Mark the current node as visited
   //为与该顶点相邻的所有顶点递归
   list<int>::iterator i;
   for (i = adj[v].begin(); i != adj[v].end(); ++i) {
      if (!visited[*i]) //If an adjacent is not visited, then recur for that adjacent {
         if (CyclicUtil(*i, visited, v))
            return true;
      }
      //如果访问了相邻节点而不是当前顶点的父节点,则存在一个循环。
         else if (*i != par)
            return true;
   }
   return false;
}
//检查图是否为树形图。
bool G ::cyclic() {
   bool *visited = new bool[n]; // Mark all the vertices as not visited and not part of recursion stack
   for (int i = 0; i < n; i++)
      visited[i] = false;
      // Call the recursive function CyclicUtil() to detect cycle in different DFS trees
      for (int u = 0; u < n; u++)
         if (!visited[u])
            if (CyclicUtil(u, visited, -1))
               return true;
               return false;
}
int main() {
   G g1(4);
   g1.addEd(0, 1);
   g1.addEd(1, 2);
   g1.cyclic() ? cout << "Undirected Graph isn't a tree\n" : cout
   << "Undirected Graph is a tree\n";
   return 0;
}

输出结果

Undirected Graph is a tree