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

C++の無向グラフの連結成分の数


n個のノードがあり、それらに0からn -1のラベルが付けられ、無向エッジのリストも与えられているとすると、無向グラフで連結成分の数を見つけるために1つの関数を定義する必要があります。

したがって、入力がn =5で、edges =[[0、1]、[1、2]、[3、4]]、

のような場合

C++の無向グラフの連結成分の数

その場合、出力は2になります

これを解決するには、次の手順に従います-

  • 関数dfs()を定義します。これにより、ノード、グラフ、visitedという配列が取得されます。

  • visited [node]がfalseの場合、-

    • 訪問済み[ノード]:=true

  • 初期化i:=0の場合、i <グラフ[ノード]のサイズの場合、更新(iを1増やします)、実行-

    • dfs(graph [node、i]、graph、visited)

  • メインの方法から、次のようにします-

  • サイズnの訪問された配列を定義します

  • nがゼロ以外の場合、-

    • 配列グラフを定義する[n]

  • 初期化i:=0の場合、i <エッジのサイズの場合、更新(iを1増やします)、実行-

    • u:=エッジ[i、0]

    • v:=エッジ[i、1]

    • グラフの最後にvを挿入します[u]

    • グラフの最後にuを挿入します[v]

  • ret:=0

  • 初期化i:=0の場合、i

    • 訪問されていない場合[i]がゼロ以外の場合、-

      • dfs(i、graph、visited)

      • (retを1増やします)

  • retを返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   void dfs(int node, vector<int< graph[], vector<bool>& visited){
      if(visited[node]) return;
         visited[node] = true;
      for(int i = 0; i < graph[node].size(); i++){
         dfs(graph[node][i], graph, visited);
      }
   }
   int countComponents(int n, vector<vector<int<>& edges) {
      vector <bool> visited(n);
      if(!n) return 0;
         vector <int< graph[n];
      for(int i = 0; i < edges.size(); i++){
         int u = edges[i][0];
         int v = edges[i][1];
         graph[u].push_back(v);
         graph[v].push_back(u);
      }
      int ret = 0;
      for(int i = 0; i < n; i++){
         if(!visited[i]){
            dfs(i, graph, visited);
            ret++;
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<vector<int<> v = {{0,1},{1,2},{3,4}};
   cout << (ob.countComponents(5, v));
}

入力

5, [[0,1],[1,2],[3,4]]

出力

2

  1. 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はサイクルに含まれて

  2. グラフが強く接続されているかどうかを確認します-C++でセット1(DFSを使用するKosaraju)

    グラフがあるとします。 Kosarajuアルゴリズムを使用して、グラフが強く接続されているかどうかを確認する必要があります。グラフは強く接続されていると言われ、2つの頂点の間にパスがある場合、グラフは接続されます。無向グラフは強く結びついたグラフです。 一部の無向グラフは接続されている可能性がありますが、強く接続されていない可能性があります。これは、強く接続されたグラフの例です。 これは、接続されているが強く接続されていないグラフの例です。 ここでは、コサラジュアルゴリズムの次の手順を使用して、グラフが強く関連しているかどうかを確認する方法を説明します。 手順 −