#include <iostream>
#include <vector>
#include <algorithm>
std::vector<int> parent, rank;
void make_set(int v) {
parent[v] = v;
rank[v] = 0;
}
int find_set(int v) {
if (v == parent[v])
return v;
return parent[v] = find_set(parent[v]);
}
void union_sets(int a, int b) {
a = find_set(a);
b = find_set(b);
if (a != b) {
if (rank[a] < rank[b])
std::swap(a, b);
parent[b] = a;
if (rank[a] == rank[b])
rank[a]++;
}
}
struct Edge {
int u, v;
double weight;
bool operator<(Edge const& other) {
return weight < other.weight;
}
};
int main() {
int n = 3;
std::vector<Edge> edges;
Edge E1 = {0,1,1.0};
Edge E2 = {1,2,1.0};
Edge E3 = {0,2,1.4142135623730951};
edges.push_back(E1);
edges.push_back(E2);
edges.push_back(E3);
int cost = 0;
std::vector<Edge> result;
parent.resize(n);
rank.resize(n);
for (int i = 0; i < n; i++)
make_set(i);
std::sort(edges.begin(), edges.end());
for (Edge e : edges) {
if (find_set(e.u) != find_set(e.v)) {
cost += e.weight;
result.push_back(e);
union_sets(e.u, e.v);
}
}
std::cout << cost << std::endl;
}
To embed this program on your website, copy the following code and paste it into your website's HTML: