// C++ program for Kruskal's algorithm to find Minimum
// Spanning Tree of a given connected, undirected and
// weighted graph
#include<bits/stdc++.h>
using namespace std;
// Creating shortcut for an integer pair
typedef pair<int, int> iPair;
// Structure to represent a graph
struct Graph
{
int V, E;
vector< pair<int, iPair> > edges;
// Constructor
Graph(int V, int E)
{
this->V = V;
this->E = E;
}
// Utility function to add an edge
void addEdge(int u, int v, int w)
{
edges.push_back({w, {u, v}});
}
// Function to find MST using Kruskal's
// MST algorithm
int kruskalMST();
};
// To represent Disjoint Sets
struct DisjointSets
{
int *parent, *rnk;
int n;
// Constructor.
DisjointSets(int n)
{
// Allocate memory
this->n = n;
parent = new int[n+1];
rnk = new int[n+1];
// Initially, all vertices are in
// different sets and have rank 0.
for (int i = 0; i < n; i++)
{
rnk[i] = 0;
//every element is parent of itself
parent[i] = i;
}
}
// Find the parent of a node 'u'
// Path Compression
int find(int u)
{
/* Make the parent of the nodes in the path
from u--> parent[u] point to parent[u] */
if (u != parent[u])
parent[u] = find(parent[u]);
return parent[u];
}
// Union by rank
void merge(int x, int y)
{
x = find(x), y = find(y);
/* Make tree with smaller height
a subtree of the other tree */
if (rnk[x] > rnk[y])
parent[y] = x;
else // If rnk[x] <= rnk[y]
parent[x] = y;
if (rnk[x] == rnk[y])
rnk[y]++;
}
};
/* Functions returns weight of the MST*/
int Graph::kruskalMST()
{
int mst_wt = 0; // Initialize result
// Sort edges in increasing order on basis of cost
sort(edges.begin(), edges.end());
// Create disjoint sets
DisjointSets ds(V);
// Iterate through all sorted edges
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);
// Check if the selected edge is creating
// a cycle or not (Cycle is created if u
// and v belong to same set)
if (set_u != set_v)
{
// Current edge will be in the MST
// so print it
cout << u << " - " << v << endl;
// Update MST weight
mst_wt += it->first;
// Merge two sets
ds.merge(set_u, set_v);
}
}
return mst_wt;
}
// Driver program to test above functions
int main()
{
/* Let us create above shown weighted
and unidrected graph */
int V = 9, E = 14;
Graph g(V, E);
// making above shown graph
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;
}
Ly8gQysrIHByb2dyYW0gZm9yIEtydXNrYWwncyBhbGdvcml0aG0gdG8gZmluZCBNaW5pbXVtCi8vIFNwYW5uaW5nIFRyZWUgb2YgYSBnaXZlbiBjb25uZWN0ZWQsIHVuZGlyZWN0ZWQgYW5kCi8vIHdlaWdodGVkIGdyYXBoCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBDcmVhdGluZyBzaG9ydGN1dCBmb3IgYW4gaW50ZWdlciBwYWlyCnR5cGVkZWYgcGFpcjxpbnQsIGludD4gaVBhaXI7CgovLyBTdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGEgZ3JhcGgKc3RydWN0IEdyYXBoCnsKCWludCBWLCBFOwoJdmVjdG9yPCBwYWlyPGludCwgaVBhaXI+ID4gZWRnZXM7CgoJLy8gQ29uc3RydWN0b3IKCUdyYXBoKGludCBWLCBpbnQgRSkKCXsKCQl0aGlzLT5WID0gVjsKCQl0aGlzLT5FID0gRTsKCX0KCgkvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGFkZCBhbiBlZGdlCgl2b2lkIGFkZEVkZ2UoaW50IHUsIGludCB2LCBpbnQgdykKCXsKCQllZGdlcy5wdXNoX2JhY2soe3csIHt1LCB2fX0pOwoJfQoKCS8vIEZ1bmN0aW9uIHRvIGZpbmQgTVNUIHVzaW5nIEtydXNrYWwncwoJLy8gTVNUIGFsZ29yaXRobQoJaW50IGtydXNrYWxNU1QoKTsKfTsKCi8vIFRvIHJlcHJlc2VudCBEaXNqb2ludCBTZXRzCnN0cnVjdCBEaXNqb2ludFNldHMKewoJaW50ICpwYXJlbnQsICpybms7CglpbnQgbjsKCgkvLyBDb25zdHJ1Y3Rvci4KCURpc2pvaW50U2V0cyhpbnQgbikKCXsKCQkvLyBBbGxvY2F0ZSBtZW1vcnkKCQl0aGlzLT5uID0gbjsKCQlwYXJlbnQgPSBuZXcgaW50W24rMV07CgkJcm5rID0gbmV3IGludFtuKzFdOwoKCQkvLyBJbml0aWFsbHksIGFsbCB2ZXJ0aWNlcyBhcmUgaW4KCQkvLyBkaWZmZXJlbnQgc2V0cyBhbmQgaGF2ZSByYW5rIDAuCgkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCgkJewoJCQlybmtbaV0gPSAwOwoKCQkJLy9ldmVyeSBlbGVtZW50IGlzIHBhcmVudCBvZiBpdHNlbGYKCQkJcGFyZW50W2ldID0gaTsKCQl9Cgl9CgoJLy8gRmluZCB0aGUgcGFyZW50IG9mIGEgbm9kZSAndScKCS8vIFBhdGggQ29tcHJlc3Npb24KCWludCBmaW5kKGludCB1KQoJewoJCS8qIE1ha2UgdGhlIHBhcmVudCBvZiB0aGUgbm9kZXMgaW4gdGhlIHBhdGgKCQlmcm9tIHUtLT4gcGFyZW50W3VdIHBvaW50IHRvIHBhcmVudFt1XSAqLwoJCWlmICh1ICE9IHBhcmVudFt1XSkKCQkJcGFyZW50W3VdID0gZmluZChwYXJlbnRbdV0pOwoJCXJldHVybiBwYXJlbnRbdV07Cgl9CgoJLy8gVW5pb24gYnkgcmFuawoJdm9pZCBtZXJnZShpbnQgeCwgaW50IHkpCgl7CgkJeCA9IGZpbmQoeCksIHkgPSBmaW5kKHkpOwoKCQkvKiBNYWtlIHRyZWUgd2l0aCBzbWFsbGVyIGhlaWdodAoJCWEgc3VidHJlZSBvZiB0aGUgb3RoZXIgdHJlZSAqLwoJCWlmIChybmtbeF0gPiBybmtbeV0pCgkJCXBhcmVudFt5XSA9IHg7CgkJZWxzZSAvLyBJZiBybmtbeF0gPD0gcm5rW3ldCgkJCXBhcmVudFt4XSA9IHk7CgoJCWlmIChybmtbeF0gPT0gcm5rW3ldKQoJCQlybmtbeV0rKzsKCX0KfTsKCi8qIEZ1bmN0aW9ucyByZXR1cm5zIHdlaWdodCBvZiB0aGUgTVNUKi8KCmludCBHcmFwaDo6a3J1c2thbE1TVCgpCnsKCWludCBtc3Rfd3QgPSAwOyAvLyBJbml0aWFsaXplIHJlc3VsdAoKCS8vIFNvcnQgZWRnZXMgaW4gaW5jcmVhc2luZyBvcmRlciBvbiBiYXNpcyBvZiBjb3N0Cglzb3J0KGVkZ2VzLmJlZ2luKCksIGVkZ2VzLmVuZCgpKTsKCgkvLyBDcmVhdGUgZGlzam9pbnQgc2V0cwoJRGlzam9pbnRTZXRzIGRzKFYpOwoJCgkvLyBJdGVyYXRlIHRocm91Z2ggYWxsIHNvcnRlZCBlZGdlcwoJdmVjdG9yPCBwYWlyPGludCwgaVBhaXI+ID46Oml0ZXJhdG9yIGl0OwoJZm9yIChpdD1lZGdlcy5iZWdpbigpOyBpdCE9ZWRnZXMuZW5kKCk7IGl0KyspCgl7CgkJaW50IHUgPSBpdC0+c2Vjb25kLmZpcnN0OwoJCWludCB2ID0gaXQtPnNlY29uZC5zZWNvbmQ7CgkJaW50IHNldF91ID0gZHMuZmluZCh1KTsKCQlpbnQgc2V0X3YgPSBkcy5maW5kKHYpOwoJCS8vIENoZWNrIGlmIHRoZSBzZWxlY3RlZCBlZGdlIGlzIGNyZWF0aW5nCgkJLy8gYSBjeWNsZSBvciBub3QgKEN5Y2xlIGlzIGNyZWF0ZWQgaWYgdQoJCS8vIGFuZCB2IGJlbG9uZyB0byBzYW1lIHNldCkKCQlpZiAoc2V0X3UgIT0gc2V0X3YpCgkJewoJCQkvLyBDdXJyZW50IGVkZ2Ugd2lsbCBiZSBpbiB0aGUgTVNUCgkJCS8vIHNvIHByaW50IGl0CgkJCWNvdXQgPDwgdSA8PCAiIC0gIiA8PCB2IDw8IGVuZGw7CgoJCQkvLyBVcGRhdGUgTVNUIHdlaWdodAoJCQltc3Rfd3QgKz0gaXQtPmZpcnN0OwoKCQkJLy8gTWVyZ2UgdHdvIHNldHMKCQkJZHMubWVyZ2Uoc2V0X3UsIHNldF92KTsKCQl9Cgl9CgoJcmV0dXJuIG1zdF93dDsKfQoKLy8gRHJpdmVyIHByb2dyYW0gdG8gdGVzdCBhYm92ZSBmdW5jdGlvbnMKaW50IG1haW4oKQp7CgkvKiBMZXQgdXMgY3JlYXRlIGFib3ZlIHNob3duIHdlaWdodGVkCglhbmQgdW5pZHJlY3RlZCBncmFwaCAqLwoJaW50IFYgPSA5LCBFID0gMTQ7CglHcmFwaCBnKFYsIEUpOwoKCS8vIG1ha2luZyBhYm92ZSBzaG93biBncmFwaAoJZy5hZGRFZGdlKDAsIDEsIDQpOwoJZy5hZGRFZGdlKDAsIDcsIDgpOwoJZy5hZGRFZGdlKDEsIDIsIDgpOwoJZy5hZGRFZGdlKDEsIDcsIDExKTsKCWcuYWRkRWRnZSgyLCAzLCA3KTsKCWcuYWRkRWRnZSgyLCA4LCAyKTsKCWcuYWRkRWRnZSgyLCA1LCA0KTsKCWcuYWRkRWRnZSgzLCA0LCA5KTsKCWcuYWRkRWRnZSgzLCA1LCAxNCk7CglnLmFkZEVkZ2UoNCwgNSwgMTApOwoJZy5hZGRFZGdlKDUsIDYsIDIpOwoJZy5hZGRFZGdlKDYsIDcsIDEpOwoJZy5hZGRFZGdlKDYsIDgsIDYpOwoJZy5hZGRFZGdlKDcsIDgsIDcpOwoKCWNvdXQgPDwgIkVkZ2VzIG9mIE1TVCBhcmUgXG4iOwoJaW50IG1zdF93dCA9IGcua3J1c2thbE1TVCgpOwoKCWNvdXQgPDwgIlxuV2VpZ2h0IG9mIE1TVCBpcyAiIDw8IG1zdF93dDsKCglyZXR1cm4gMDsKfQo=