C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

無向グラフがツリーであるか、DFSを使用していないかを確認するC++プログラム


グラフにサイクルが含まれていない場合、グラフはツリーです。これは、無向グラフがツリーであるかどうかをチェックするC++プログラムです。

アルゴリズム

Begin
function cyclicUtil() :
   A) Mark the current node as visited.
   B) Recur for all the vertices adjacent to this vertex.
   C) If an adjacent is not visited, then recur for that adjacent.
   D) If an adjacent is visited and not parent of current vertex, then there is a cycle.
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 function uses visited[] to detect cycle in subgraph reachable from vertex v:
bool G::CyclicUtil(int v, bool visited[], int par) {
   visited[v] = true; // Mark the current node as visited
   // 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]) //If an adjacent is not visited, then recur for that adjacent {
         if (CyclicUtil(*i, visited, v))
            return true;
      }
      // If an adjacent is visited and not parent of current vertex, then there is a cycle.
         else if (*i != par)
            return true;
   }
   return false;
}
// to check if the graph is tree or not.
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

  1. グラフが強く接続されているかどうかをチェックするC++プログラム

    有向グラフでは、1つのコンポーネントの頂点の各ペアの間にパスがある場合、コンポーネントは強く接続されていると言われます。 このアルゴリズムを解決するには、まず、DFSアルゴリズムを使用して各頂点の終了時間を取得し、次に転置されたグラフの終了時間を検索します。次に、頂点をトポロジカルソートの降順で並べ替えます。 入力 :グラフの隣接行列。 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 出力 :以下は、与え

  2. DFSを使用して有向グラフの接続性をチェックするC++プログラム

    グラフの接続性を確認するために、トラバーサルアルゴリズムを使用してすべてのノードをトラバースしようとします。トラバーサルの完了後、アクセスされていないノードがある場合、グラフは接続されていません。 有向グラフの場合、接続を確認するためにすべてのノードからトラバースを開始します。 1つのエッジに外向きのエッジのみがあり、内向きのエッジがない場合があるため、他の開始ノードからノードにアクセスできなくなります。 この場合、トラバーサルアルゴリズムは再帰的なDFSトラバーサルです。 入力 :グラフの隣接行列 0 1 0 0 0 0 0 1 0