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

C++でSTLを使用するクラスカルの最小スパニングツリー


このチュートリアルでは、C++でSTLを使用してクラスカルの最小スパニングツリーを理解するためのプログラムについて説明します。

このために、接続された無向の重み付けされたグラフが提供されます。私たちのタスクは、与えられたグラフの最小スパニングツリーを計算することです。

#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> iPair;
//structure for graph
struct Graph{
   int V, E;
   vector< pair<int, iPair> > edges;
   Graph(int V, int E){
      this->V = V;
      this->E = E;
   }
   void addEdge(int u, int v, int w){
      edges.push_back({w, {u, v}});
   }
   int kruskalMST();
};
struct DisjointSets{
   int *parent, *rnk;
   int n;
   DisjointSets(int n){
      this->n = n;
      parent = new int[n+1];
      rnk = new int[n+1];
   for (int i = 0; i <= n; i++){
      rnk[i] = 0;
      parent[i] = i;
   }
}
int find(int u){
   if (u != parent[u])
   parent[u] = find(parent[u]);
   return parent[u];
}
void merge(int x, int y){
   x = find(x), y = find(y);
   if (rnk[x] > rnk[y])
      parent[y] = x;
   else
      parent[x] = y;
   if (rnk[x] == rnk[y])
      rnk[y]++;
   }
};
int Graph::kruskalMST(){
   int mst_wt = 0;
   sort(edges.begin(), edges.end());
   DisjointSets ds(V);
   vector< pair<int, iPair> >::iterator it;
   for (it=edges.begin(); it!=edges.end(); it++){
      int u = it->second.first;
      int v = it->second.second;
      int set_u = ds.find(u);
      int set_v = ds.find(v);
      if (set_u != set_v){
         cout << u << " - " << v << endl;
         mst_wt += it->first;
         ds.merge(set_u, set_v);
      }
   }
   return mst_wt;
}
int main(){
   int V = 9, E = 14;
   Graph g(V, E);
   g.addEdge(0, 1, 4);
   g.addEdge(0, 7, 8);
   g.addEdge(1, 2, 8);
   g.addEdge(1, 7, 11);
   g.addEdge(2, 3, 7);
   g.addEdge(2, 8, 2);
   g.addEdge(2, 5, 4);
   g.addEdge(3, 4, 9);
   g.addEdge(3, 5, 14);
   g.addEdge(4, 5, 10);
   g.addEdge(5, 6, 2);
   g.addEdge(6, 7, 1);
   g.addEdge(6, 8, 6);
   g.addEdge(7, 8, 7);
   cout << "Edges of MST are \n";
   int mst_wt = g.kruskalMST();
   cout << "\nWeight of MST is " << mst_wt;
   return 0;
}

出力

Edges of MST are
6 - 7
2 - 8
5 - 6
0 - 1
2 - 5
2 - 3
0 - 7
3 - 4
Weight of MST is 37

  1. C++でツリーノードを削除する

    ツリーがあり、このツリーはノード0をルートとしていると仮定します。これは、次のように与えられます- ノードの数はノードです i番目のノードの値はvalue[i] i番目のノードの親はparent[i] ノードの値の合計が0であるすべてのサブツリーを削除する必要があります。削除すると、ツリーに残っているノードの数が返されます。したがって、ツリーが次のような場合- 7つのノードがあり、出力は2になります これを解決するには、次の手順に従います- 子供と呼ばれる地図を作成する dfs()というメソッドを定義します。これにより、ノード、配列値、グラフが取得されます temp:=ペ

  2. C++での木の直径

    無向ツリーがあるとします。その直径を見つける必要があります-そのツリーの最長パスのエッジの数は、そのツリーの直径です。ここで、ツリーはエッジリストとして与えられます。ここで、edges [i] =[u、v]は、ノードuとvの間の双方向エッジです。各ノードには、セット{0、1、...、edges.length}にラベルがあります。したがって、グラフが次のような場合- 出力は4になります。 これを解決するには、次の手順に従います- マップを定義するl dfs()というメソッドを定義します。これには、v、visitedと呼ばれる配列、グラフ、およびcが必要です。次のように機能します-