Cプログラムの1から始まるグラフの辞書式最小のDFSを印刷します。
N個の頂点とM個のエッジを持つ連結グラフが表示されます。したがって、1から始まるグラフの辞書式最小のDFSを印刷する必要があります。
頂点には1からNまでの番号を付ける必要があります
例
Input: N = 5 M =5 edge(1, 4, arr) edge(3, 4, arr) edge(5, 4, arr) edge(3, 2, arr) edge(1, 5, arr) edge(1, 2, arr) edge(3, 5, arr) edge(1, 3, arr) output: 1 2 3 4 5
通常のDFSを実行する代わりに、最初に各頂点に関連付けられたエッジを並べ替えて、各ターンで最小のエッジのみが最初に選択されるようにします。並べ替え後、通常のDFSを実行するだけで、辞書式順序で最小のDFSトラバーサルが得られます。
以下に示すのは、以下に示すアルゴリズムのC++実装です。
アルゴリズム
Start Step 1 -> Declare Function void lexo(vector<int>* arr, int n) Declare bool check[n + 1] = { 0 } Loop For int i=0 and i<n and i++ Call sort(arr[i].begin(), arr[i].end()) Loop For int i = 1 and i < n and i++ IF !check[i] Call graph(arr, i, n, check) End End Step 2 -> declare Function void edge(int u, int v, vector<int>* arr) Call ar[u].push_back(v) Call ar[v].push_back(u) Step 3 -> Declare function void graph(vector<int>* arr, int src, int n,bool* check) print src Set check[src] = true Loop for int i = 0 and i < arr[src].size() and i++ IF !check[arr[src][i]] Call graph(arr, arr[src][i], n, check) End End Step 4- > In main() Declare int n = 5, m = 5 Use STL vector<int> arr[n + 1] Call edges(1,4, arr) Call edges(3,4, arr).... Call lexo(arr, n) Stop
例
#include <bits/stdc++.h> using namespace std; //for inserting an edge void edge(int u, int v, vector<int>* arr){ arr[u].push_back(v); arr[v].push_back(u); } // Function for dfs graph traversal void graph(vector<int>* arr, int src, int n,bool* check){ cout << src << " "; check[src] = true; for (int i = 0; i < arr[src].size(); i++){ if (!check[arr[src][i]]) graph(arr, arr[src][i], n, check); } } void lexo(vector<int>* arr, int n){ bool check[n + 1] = { 0 }; for (int i = 0; i < n; i++) sort(arr[i].begin(), arr[i].end()); for (int i = 1; i < n; i++){ if (!check[i]) graph(arr, i, n, check); } } int main(){ int n = 5, m = 5; vector<int> arr[n + 1]; // for inserting an edge edge(1, 4, arr); edge(3, 4, arr); edge(5, 4, arr); edge(3, 2, arr); edge(1, 5, arr); edge(1, 2, arr); edge(3, 5, arr); edge(1, 3, arr); //call lexo function lexo(arr, n); return 0; }
出力
上記のプログラムを実行すると、次の出力が生成されます
1 2 3 4 5
-
グラフから減らすことができるスコアの最大量を見つけるためのC++プログラム
n個の頂点とm個のエッジを持つ重み付きの無向グラフがあるとします。グラフのスコアは、グラフ内のすべてのエッジの重みの加算として定義されます。エッジの重みは負の値になる可能性があり、それらを削除するとグラフのスコアが増加します。グラフを接続したまま、グラフからエッジを削除して、グラフのスコアを最小にする必要があります。減らすことができるスコアの最大量を見つける必要があります。 グラフは配列edgesで与えられ、各要素は{weight、{vertex1、vertex2}}の形式です。 したがって、入力がn =5、m =6、edges ={{2、{1、2}}、{2、{1、3}}、{1、{2、3}
-
すべてのサイクルをC++の無向グラフに出力します
この問題では、無向グラフが与えられ、グラフに形成されるすべてのサイクルを印刷する必要があります。 無向グラフ 互いに接続されたグラフです。一方向グラフのすべてのエッジは双方向です。無向ネットワークとも呼ばれます。 サイクル グラフのデータ構造は、すべての頂点がサイクルを形成するグラフです。 問題をよりよく理解するための例を見てみましょう- グラフ- 出力- Cycle 1: 2 3 4 5 Cycle 2: 6 7 8 このために、グラフのいくつかのプロパティを利用します。グラフ彩色法を使用して、閉路グラフで発生するすべての頂点に色を付ける必要があります。また、頂点