Untitled
unknown
plain_text
a year ago
2.0 kB
9
Indexable
#include <iostream>
#include <vector>
#include <algorithm>
struct Edge {
int u, v, weight;
};
class DSU {
public:
DSU(int n) {
parent.resize(n);
rank.resize(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];
}
void unionSets(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
if (rank[rootX] > rank[rootY]) {
parent[rootY] = rootX;
} else if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY;
} else {
parent[rootY] = rootX;
rank[rootX]++;
}
}
}
private:
std::vector<int> parent, rank;
};
std::vector<Edge> kruskalMST(int n, std::vector<Edge>& edges) {
std::sort(edges.begin(), edges.end(), [](Edge& a, Edge& b) {
return a.weight < b.weight;
});
DSU dsu(n);
std::vector<Edge> mst;
for (const Edge& e : edges) {
if (dsu.find(e.u) != dsu.find(e.v)) {
dsu.unionSets(e.u, e.v);
mst.push_back(e);
}
}
return mst;
}
int main() {
int n, m;
std::cout << "Enter the number of vertices and edges: ";
std::cin >> n >> m;
std::vector<Edge> edges(m);
std::cout << "Enter the edges (u, v, weight):\n";
for (int i = 0; i < m; ++i) {
std::cin >> edges[i].u >> edges[i].v >> edges[i].weight;
}
std::vector<Edge> mst = kruskalMST(n, edges);
std::cout << "Minimum Spanning Tree edges:\n";
int totalWeight = 0;
for (const Edge& e : mst) {
std::cout << e.u << " - " << e.v << " : " << e.weight << "\n";
totalWeight += e.weight;
}
std::cout << "Total weight of MST: " << totalWeight << "\n";
return 0;
}
Editor is loading...
Leave a Comment