Back
3
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Edge {
int src, dest, weight;
};
struct Subset {
int parent;
int rank;
};
bool compareEdges(Edge a, Edge b) {
return a.weight < b.weight;
}
int find(vector<Subset>& subsets, int i) {
if (subsets[i].parent != i)
subsets[i].parent = find(subsets, subsets[i].parent);
return subsets[i].parent;
}
void Union(vector<Subset>& subsets, int x, int y) {
int xroot = find(subsets, x);
int yroot = find(subsets, y);
if (subsets[xroot].rank < subsets[yroot].rank)
subsets[xroot].parent = yroot;
else if (subsets[xroot].rank > subsets[yroot].rank)
subsets[yroot].parent = xroot;
else {
subsets[yroot].parent = xroot;
subsets[xroot].rank++;
}
}
void KruskalMST(int V, vector<Edge>& edges) {
vector<Edge> result;
int e = 0;
int i = 0;
sort(edges.begin(), edges.end(), compareEdges);
vector<Subset> subsets(V);
for (int v = 0; v < V; ++v) {
subsets[v].parent = v;
subsets[v].rank = 0;
}
while (e < V - 1 && i < edges.size()) {
Edge next_edge = edges[i++];
int x = find(subsets, next_edge.src);
int y = find(subsets, next_edge.dest);
if (x != y) {
result.push_back(next_edge);
Union(subsets, x, y);
e++;
}
}
cout << "Edges in the Minimum Spanning Tree:" << endl;
int minimumCost = 0;
for (i = 0; i < result.size(); ++i) {
cout << result[i].src << " -- " << result[i].dest << " == " << result[i].weight << endl;
minimumCost += result[i].weight;
}
cout << "Minimum Cost Spanning Tree: " << minimumCost << endl;
}
int main() {
int V, E;
cout << "Enter number of vertices and edges: ";
cin >> V >> E;
vector<Edge> edges(E);
cout << "Enter edges (source, destination, weight):" << endl;
for (int i = 0; i < E; i++) {
cin >> edges[i].src >> edges[i].dest >> edges[i].weight;
}
KruskalMST(V, edges);
return 0;
}