Untitled

 avatar
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