Kruskal's Algorithm Code


#include 
using namespace std;

struct Edge {
    int src, dest, weight;
};

int find(vector& parent, int node) {
    if (parent[node] != node) {
        parent[node] = find(parent, parent[node]);
    }
    return parent[node];
}

void unionSets(vector& parent, vector& rank, int u, int v) {
    int rootU = find(parent, u);
    int rootV = find(parent, v);

    if (rootU != rootV) {
        if (rank[rootU] > rank[rootV]) {
            parent[rootV] = rootU;
        } else if (rank[rootU] < rank[rootV]) {
            parent[rootU] = rootV;
        } else {
            parent[rootV] = rootU;
            rank[rootU]++;
        }
    }
}

int kruskal(int n, vector& edges) {
    sort(edges.begin(), edges.end(), [](const Edge& a, const Edge& b) {
        return a.weight < b.weight;
    });

    vector parent(n), rank(n, 0);
    for (int i = 0; i < n; ++i) {
        parent[i] = i;
    }

    int mstCost = 0;
    vector mstEdges;

    for (const auto& edge : edges) {
        if (find(parent, edge.src) != find(parent, edge.dest)) {
            mstCost += edge.weight;
            mstEdges.push_back(edge);
            unionSets(parent, rank, edge.src, edge.dest);
        }
    }

    cout << "Edges in the MST for distributing resources across disaster-hit zones:\n";
    for (const auto& edge : mstEdges) {
        cout << edge.src << " -- " << edge.dest << " == " << edge.weight << '\n';
    }

    return mstCost;
}

void krus_11() {
    int n = 4;
    vector edges = {
        {0, 1, 4},
        {1, 2, 1},
        {0, 2, 3},
        {2, 3, 2},
        {1, 3, 5}
    };

    int mstCost = kruskal(n, edges);

    cout << "Total cost of MST: " << mstCost << '\n';
}