Kruskal's Algorithm
Loading editor...
#include <bits/stdc++.h>
using namespace std;
struct Edge {
int u, v;
long long w;
};
struct UnionFind {
vector<int> parent, rankv;
UnionFind(int n) : parent(n), rankv(n, 0) {
for (int i = 0; i < n; ++i) parent[i] = i;
}
int find(int x) {
if (parent[x] != x) parent[x] = find(parent[x]);
return parent[x];
}
bool unite(int x, int y) {
int rx = find(x), ry = find(y);
if (rx == ry) return false;
if (rankv[rx] < rankv[ry]) parent[rx] = ry;
else if (rankv[rx] > rankv[ry]) parent[ry] = rx;
else { parent[ry] = rx; ++rankv[rx]; }
return true;
}
};
vector<Edge> kruskal(vector<Edge> &edges, int nodeCount) {
sort(edges.begin(), edges.end(), [](const Edge &a, const Edge &b) {
return a.w < b.w;
});
UnionFind unionFind(nodeCount);
vector<Edge> mstEdges;
for (const auto &e : edges) {
if (unionFind.unite(e.u, e.v)) {
mstEdges.push_back(e);
if ((int)mstEdges.size() == nodeCount - 1) break;
}
}
return {mstEdges};
}
Number of nodes.
Edges between nodes, one per line.