Cod sursa(job #2702272)

Utilizator DragosC1Dragos DragosC1 Data 3 februarie 2021 15:06:39
Problema Arbore partial de cost minim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

#define pair pair<int, int>

int n;
int T[200001];
long long suma;

vector<pair> drum;

struct muchie {
    int x, y, c;
} mch[400001];

bool csort(muchie a, muchie b) {
    if (a.c < b.c)
        return 1;
    return 0;
}

int Radacina(int x) {
    if (x == T[x]) return x;
    else return T[x] = Radacina(T[x]);
}

void Uneste(int x, int y) {
    if (T[x] > T[y]) T[x] = T[y];
    else T[y] = T[x];
}

int main() {
    int i, m, x, y, r1, r2;

    ifstream f("apm.in");
    f >> n >> m;
    for (i = 1; i <= m; i++)
        f >> mch[i].x >> mch[i].y >> mch[i].c;
    f.close();

    for (i = 1; i <= n; i++)
        T[i] = i;
    
    sort(mch + 1, mch + m + 1, csort);

    for (i = 1; i <= m; i++) {
        r1 = Radacina(mch[i].x), r2 = Radacina(mch[i].y);
        if (r1 != r2) {
            Uneste(mch[i].x, mch[i].y);
            suma += mch[i].c;
            drum.push_back({mch[i].x, mch[i].y});
        }
    }

    ofstream g("apm.out");
    g << suma << '\n';
    g << drum.size() << '\n';
    for (i = 0; i < drum.size(); i++)
        g << drum[i].second << ' ' << drum[i].first << '\n';
    g.close();

    return 0;
}