Cod sursa(job #3320137)

Utilizator SigutzBarcan Silviu Ioan Sigutz Data 4 noiembrie 2025 12:51:06
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
std::ifstream fin("apm.in");
std::ofstream fout("apm.out");

struct Muchie {
    int u, v, cost;

    bool operator<(const Muchie &m) const {
        return cost < m.cost;
    }

    bool operator>(const Muchie &m) const {
        return cost > m.cost;
    }
};

struct DSU {
    std::vector<int> tata;
    std::vector<int> h;

    DSU(int n) {
        tata.assign(n+1, 0);
        h.assign(n+1, 0);
    }

    int find(int u) {
        if (!tata[u])
            return u;
        return tata[u] = find(tata[u]);
    }

    void unite(int u, int v) {
        int ru = find(u);
        int rv = find(v);
        if (ru != rv) {
            if (h[ru] > h[rv]) {
                tata[rv] = ru;
            } else {
                tata[ru] = rv;
                if (h[ru] == h[rv]) {
                    h[rv] += 1;
                }
            }
        }
    }
};

void kruskal(int n, int m, std::vector<Muchie> &muchii) {
    std::sort(muchii.begin(), muchii.end());
    DSU dsu(n);
    std::vector<Muchie> apcm;
    int costTotal = 0;
    int nrmsel = 0;
    for (const auto &muchie: muchii) {
        if (dsu.find(muchie.u) != dsu.find(muchie.v)) {
            apcm.push_back(muchie);
            costTotal += muchie.cost;
            nrmsel++;
            dsu.unite(muchie.u, muchie.v);
            if (nrmsel == n - 1) {
                break;
            }
        }
    }
    fout << costTotal << "\n";
    fout << apcm.size() << "\n";
    for (const auto &muchie: apcm) {
        fout << muchie.u << " " << muchie.v << "\n";
    }
}

int main() {
    int n, m;
    fin >> n >> m;
    std::vector<Muchie> muchii(m);
    for (int i = 0; i < m; i++) {
        fin >> muchii[i].u >> muchii[i].v >> muchii[i].cost;
    }
    kruskal(n, m, muchii);
    fin.close();
    fout.close();
}