Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में एसटीएल का उपयोग करते हुए क्रुस्कल का न्यूनतम स्पैनिंग ट्री


इस ट्यूटोरियल में, हम 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++ में बाइनरी ट्री की न्यूनतम गहराई

    मान लीजिए हमारे पास एक बाइनरी ट्री है; हमें उस वृक्ष की न्यूनतम गहराई ज्ञात करनी है। जैसा कि हम जानते हैं कि न्यूनतम गहराई रूट नोड से निकटतम लीफ नोड तक सबसे छोटे पथ के साथ नोड्स की संख्या है। तो, अगर इनपुट पसंद है तो आउटपुट 2 . होगा इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - ट्री नोड्स

  1. C++ में ट्री नोड्स हटाएं

    मान लीजिए कि हमारे पास एक पेड़ है, इस पेड़ की जड़ें नोड 0 पर हैं, यह इस प्रकार दिया गया है - नोड्स की संख्या नोड्स है ith नोड का मान मान है[i] ith नोड का जनक माता-पिता है[i] हमें प्रत्येक सबट्री को हटाना होगा जिसका नोड्स के मानों का योग 0 है, ऐसा करने के बाद पेड़ में शेष नोड्स की संख्या वापस कर द

  1. C++ में पेड़ का व्यास

    मान लीजिए कि हमारे पास एक अप्रत्यक्ष पेड़ है; हमें इसका व्यास ज्ञात करना है - उस पेड़ के सबसे लंबे पथ में किनारों की संख्या उस पेड़ का व्यास है। यहां पेड़ को किनारे की सूची के रूप में दिया गया है जहां किनारों [i] =[यू, वी] नोड्स यू और वी के बीच एक द्विदिश किनारा है। प्रत्येक नोड में सेट {0, 1, ...,