#include <iostream>
#include <vector>
#include <algorithm>
class DisjointSet {
public:
DisjointSet(int n) {
rank.resize(n + 1, 0);
parent.resize(n + 1);
size.resize(n + 1, 1);
for (int i = 0; i <= n; ++i) {
parent[i] = i;
}
}
int find_upar(int node) {
if (node == parent[node]) {
return node;
}
return parent[node] = find_upar(parent[node]);
}
void union_by_rank(int u, int v) {
int ulp_u = find_upar(u);
int ulp_v = find_upar(v);
if (ulp_u == ulp_v) {
return;
}
if (rank[ulp_u] < rank[ulp_v]) {
parent[ulp_u] = ulp_v;
} else if (rank[ulp_v] < rank[ulp_u]) {
parent[ulp_v] = ulp_u;
} else {
parent[ulp_v] = ulp_u;
rank[ulp_u]++;
}
}
void union_by_size(int u, int v) {
int ulp_u = find_upar(u);
int ulp_v = find_upar(v);
if (ulp_u == ulp_v) {
return;
}
if (size[ulp_u] < size[ulp_v]) {
parent[ulp_u] = ulp_v;
size[ulp_v] += size[ulp_u];
} else {
parent[ulp_v] = ulp_u;
size[ulp_u] += size[ulp_v];
}
}
private:
std::vector<int> rank;
std::vector<int> parent;
std::vector<int> size;
};
class Solution {
public:
int spanningTree(int V, std::vector<std::vector<std::pair<int, int>>>& adj) {
std::vector<std::tuple<int, int, int>> edges;
for (int i = 0; i < V; ++i) {
for (auto& it : adj[i]) {
int adjNode = it.first;
int wt = it.second;
int node = i;
edges.push_back(std::make_tuple(wt, node, adjNode));
}
}
DisjointSet ds(V);
std::sort(edges.begin(), edges.end());
int mstWt = 0;
for (auto& edge : edges) {
int wt = std::get<0>(edge);
int u = std::get<1>(edge);
int v = std::get<2>(edge);
if (ds.find_upar(u) != ds.find_upar(v)) {
mstWt += wt;
ds.union_by_size(u, v);
}
}
return mstWt;
}
};
int main() {
int V = 5;
std::vector<std::vector<std::pair<int, int>>> adj(V);
std::vector<std::vector<int>> edges = {
{0, 1, 2}, {0, 2, 1}, {1, 2, 1}, {2, 3, 2}, {3, 4, 1}, {4, 2, 2}
};
for (auto& it : edges) {
int u = it[0], v = it[1], wt = it[2];
adj[u].emplace_back(v, wt);
adj[v].emplace_back(u, wt);
}
Solution obj;
int mstWt = obj.spanningTree(V, adj);
std::cout << "The sum of all the edge weights: " << mstWt << std::endl;
return 0;
}
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter