無向グラフでのサイクルの検出
無向グラフにサイクルがあるかどうかを検出するために、指定されたグラフのDFSトラバーサルを使用します。訪問した頂点vごとに、隣接する頂点uが見つかった場合、uはすでに訪問されており、uは頂点vの親ではありません。その後、1サイクルが検出されます。
頂点のペアには平行なエッジがないと仮定します。
Input and Output: Adjacency matrix 0 1 0 0 0 1 0 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0 Output: The graph has cycle.
アルゴリズム
dfs(vertex, visited, parent)
Input: The start vertex, the visited set, and the parent node of the vertex.
Output: True a cycle is found.Begin add vertex in the visited set for all vertex v which is adjacent with vertex, do if v = parent, then return true if v is not in the visited set, then return true if dfs(v, visited, vertex) is true, then return true done return false End hasCycle(graph) Input: The given graph. Output: True when a cycle has found.Begin for all vertex v in the graph, do if v is not in the visited set, then go for next iteration if dfs(v, visited, φ) is true, then //parent of v is null return true return false done End
例
#include<iostream> #include<set> #define NODE 5 using namespace std; int graph[NODE][NODE] = { {0, 1, 0, 0, 0}, {1, 0, 1, 1, 0}, {0, 1, 0, 0, 1}, {0, 1, 0, 0, 1}, {0, 0, 1, 1, 0} }; bool dfs(int vertex, set<int>&visited, int parent) { visited.insert(vertex); for(int v = 0; v<NODE; v++) { if(graph[vertex][v]) { if(v == parent) //if v is the parent not move that direction continue; if(visited.find(v) != visited.end()) //if v is already visited return true; if(dfs(v, visited, vertex)) return true; } } return false; } bool hasCycle() { set<int> visited; //visited set for(int v = 0; v<NODE; v++) { if(visited.find(v) != visited.end()) //when visited holds v, jump to next iteration continue; if(dfs(v, visited, -1)) { //-1 as no parent of starting vertex return true; } } return false; } int main() { bool res; res = hasCycle(); if(res) cout << "The graph has cycle." << endl; else cout << "The graph has no cycle." << endl; }
出力
The graph has cycle.
-
無向グラフにオイラー閉路が含まれているかどうかを確認するC++プログラム
オイラー回路について知るために、オイラーパスについての考えがあります。オイラーパスはパスです。これにより、すべてのノードに1回だけアクセスできます。同じエッジを複数回使用できます。オイラー回路は、特殊なタイプのオイラーパスです。オイラーパスの開始頂点がそのパスの終了頂点にも接続されている場合。 回路を検出するには、次の条件に従う必要があります。 グラフを接続する必要があります。 無向グラフの頂点の次数が奇数でない場合、それはオイラー回路です。 入力 出力 グラフにはオイラー回路があります。 アルゴリズム traverse(u、visited) 入力開始ノードuと訪問済みノード
-
有向グラフでサイクルを検出するためのPythonプログラム
この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −有向グラフが与えられたので、グラフにサイクルが含まれているかどうかを確認する必要があります。指定されたグラフに少なくとも1つのサイクルが含まれている場合、出力はtrueである必要があり、そうでない場合はfalseです。 次に、以下の実装のソリューションを見てみましょう- 例 # collections module from collections import defaultdict # class for creation of graphs class Graph(): #