Untitled
unknown
plain_text
6 months ago
2.0 kB
5
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