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

C++の無向グラフの連結成分すべての最小要素の合計


この問題では、arr [i]が(i + 1)番目のノードを表すN個の数値の配列arrが与えられます。また、エッジのMペアがあり、uとvはエッジによって接続されたノードを表します。私たちのタスクは、無向グラフのすべての連結成分の最小要素の合計を見つけるプログラムを作成することです。ノードが他のノードに接続されていない場合は、1つのノードを持つコンポーネントとしてカウントします。

問題を理解するために例を見てみましょう

入力

arr[] = {2, 7, 5, 1, 2} m = 2
1 2
4 5

出力

8

説明

以下は上に描かれたグラフです-

C++の無向グラフの連結成分すべての最小要素の合計

2つの接続されたノードと1つの単一ノードがあります

それでは、接続されているすべてのコンポーネントを最小限に抑えましょう

最小(ノード1およびノー​​ド2)=最小(2、7)=2

最小(ノード4およびノー​​ド5)=最小(1、3)=1

最小(ノード3)=最小(5)=5

合計=1+ 2 + 5 =8

この問題を解決するために、トラバーサル手法(BFSまたはDFS)のいずれかを使用して、無向グラフの接続されたすべてのノードを見つけ、二重訪問がないために訪問されたすべてのノードの訪問済み配列を作成します。直接または間接的に接続されている接続されたノードにアクセスすると、すべての接続の最小値が見つかります。そして、sum変数のこの最小値を追加します。すべてのノードにアクセスしたら、合計を出力します。

ソリューションの動作を説明するプログラム

#include <bits/stdc++.h>
using namespace std;
const int N = 100;
vector<int> graph[N];
bool visited[N];
void dfs(int node, int arr[], int minimum){
   minimum = min(minimum, arr[node]);
   visited[node] = true;
   for (int i : graph[node]) {
      if (!visited[i])
         dfs(i, arr, minimum);
   }
}
void createEdge(int u, int v){
   graph[u - 1].push_back(v - 1);
   graph[v - 1].push_back(u - 1);
}
int minSum(int arr[], int n){
   int sum = 0;
   for (int i = 0; i < n; i++) {
      if (!visited[i]) {
         int minimum = arr[i];
         dfs(i, arr, minimum);
         sum += minimum;
      }
   }
   return sum;
}
int main(){
   int arr[] = {2, 7, 5, 1, 3};
   createEdge(1, 2);
   createEdge(4, 5);
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The sum of minimum elements in all connected components of an undirected graph is ";
   cout<<minSum(arr, n);
   return 0;
}

出力

The sum of minimum elements in all connected components of an undirected graph is 8

  1. すべてのサイクルをC++の無向グラフに出力します

    この問題では、無向グラフが与えられ、グラフに形成されるすべてのサイクルを印刷する必要があります。 無向グラフ 互いに接続されたグラフです。一方向グラフのすべてのエッジは双方向です。無向ネットワークとも呼ばれます。 サイクル グラフのデータ構造は、すべての頂点がサイクルを形成するグラフです。 問題をよりよく理解するための例を見てみましょう- グラフ- 出力- Cycle 1: 2 3 4 5 Cycle 2: 6 7 8 このために、グラフのいくつかのプロパティを利用します。グラフ彩色法を使用して、閉路グラフで発生するすべての頂点に色を付ける必要があります。また、頂点

  2. C++の無向グラフのすべてのサイクルの長さの積

    入力として無向グラフと無加重グラフが与えられます。タスクは、与えられた中で形成されたサイクルの積を見つけて、結果を表示することです。 例 入力 与えられた図では、8つのノードがあり、そのうち5つのノードが1、6、3、5、8を含むサイクルを形成しており、残りのノードはサイクルに含まれていません。したがって、サイクルの長さは5ノードを含むため5であり、したがって積は5です 与えられた図では、12個のノードがあり、そのうち11個(5 +6)個のノードが、1、6、3、5、8、9、4、10、11、22、12および残りのノードを含むサイクルを形成しています。ノード2はサイクルに含まれて