無向グラフにオイラーパスが含まれているかどうかを確認するC++プログラム
オイラーパスはパスです。これにより、すべてのノードに1回だけアクセスできます。同じエッジを複数回使用できます。オイラー回路は、特殊なタイプのオイラーパスです。オイラーパスの開始頂点がそのパスの終了頂点にも接続されている場合。
オイラーパスを検出するには、これらの条件に従う必要があります
- グラフを接続する必要があります。
- 無向グラフの頂点の次数が奇数でない場合、それはオイラー回路であり、これも1つのオイラーパスです。
- ちょうど2つの頂点の次数が奇数の場合、それはオイラーパスです。
入力
出力
両方のグラフにオイラーパスがあります。
アルゴリズム
traverse(u、visited)
入力:開始ノードuと訪問済みノードは、どのノードが訪問されたかをマークします。
出力:接続されているすべての頂点をトラバースします。
Begin mark u as visited for all vertex v, if it is adjacent with u, do if v is not visited, then traverse(v, visited) done End
isConnected(graph)
入力:グラフ。
出力:グラフが接続されている場合はTrue。
Begin define visited array for all vertices u in the graph, do make all nodes unvisited traverse(u, visited) if any unvisited node is still remaining, then return false done return true End
isEulerian(Graph)
入力:指定されたグラフ。
出力:オイラー回路またはパスの場合は1を返し、オイラーパスがない場合は0を返します。
Begin if isConnected() is false, then return false define list of degree for each node oddDegree := 0 for all vertex i in the graph, do for all vertex j which are connected with i, do increase degree done if degree of vertex i is odd, then increase oddDegree done if oddDegree > 0, then return 0 else return 1 End
サンプルコード
#include<iostream> #include<vector> #define NODE 5 using namespace std; int graph[NODE][NODE] = {{0, 1, 1, 1, 0}, {1, 0, 1, 0, 0}, {1, 1, 0, 0, 0}, {1, 0, 0, 0, 1}, {0, 0, 0, 1, 0}}; /*int graph[NODE][NODE] = {{0, 1, 1, 1, 1}, {1, 0, 1, 0, 0}, {1, 1, 0, 0, 0}, {1, 0, 0, 0, 1}, {1, 0, 0, 1, 0}};*/ //uncomment to check Euler Circuit as well as path /*int graph[NODE][NODE] = {{0, 1, 1, 1, 0}, {1, 0, 1, 1, 0}, {1, 1, 0, 0, 0}, {1, 1, 0, 0, 1}, {0, 0, 0, 1, 0}};*/ //Uncomment to check Non Eulerian Graph void traverse(int u, bool visited[]) { visited[u] = true; //mark v as visited for(int v = 0; v<NODE; v++) { if(graph[u][v]) { if(!visited[v]) traverse(v, visited); } } } bool isConnected() { bool *vis = new bool[NODE]; //for all vertex u as start point, check whether all nodes are visible or not for(int u; u < NODE; u++) { for(int i = 0; i<NODE; i++) vis[i] = false; //initialize as no node is visited traverse(u, vis); for(int i = 0; i<NODE; i++){ if(!vis[i]) //if there is a node, not visited by traversal, graph is not connected return false; } } return true; } int isEulerian() { if(isConnected() == false) //when graph is not connected return 0; vector<int> degree(NODE, 0); int oddDegree = 0; for(int i = 0; i<NODE; i++) { for(int j = 0; j<NODE; j++) { if(graph[i][j]) degree[i]++; //increase degree, when connected edge found } if(degree[i] % 2 != 0) //when degree of vertices are odd oddDegree++; //count odd degree vertices } if(oddDegree > 2) //when vertices with odd degree greater than 2 return 0; return 1; //when oddDegree is 0, it is Euler circuit, and when 2, it is Euler path } int main() { if(isEulerian() != 0) { cout << "The graph has Eulerian path." << endl; } else { cout << "The graph has No Eulerian path." << endl; } }
出力
The graph has Eulerian path.
-
有向グラフにオイラー閉路が含まれているかどうかを確認するC++プログラム
オイラーサイクル/回路はパスです。これにより、すべてのエッジを1回だけ訪問できます。同じ頂点を複数回使用できます。オイラー回路は、特殊なタイプのオイラーパスです。オイラーパスの開始頂点がそのパスの終了頂点にも接続されている場合、それはオイラー回路と呼ばれます。 グラフがオイラーであるかどうかを確認するには、2つの条件を確認する必要があります- グラフを接続する必要があります。 各頂点の次数と次数は同じである必要があります。 入力 −グラフの隣接行列。 0 1 0 0 0 0 0 1 0 0 0 0 0
-
グラフが強く接続されているかどうかをチェックする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 出力 :以下は、与え