Cod sursa(job #2424481)

Utilizator mariusilieMarius Ilie mariusilie Data 23 mai 2019 05:31:38
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#define MLIM 400001
#define NLIM 200001

using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");

int tati[NLIM], rang[NLIM], n, m, k = 0, s;
pair<int, int> Sol[MLIM];
struct Muchie {
    int s, d, c;
}Muchii[MLIM];

bool cmpCost(Muchie a, Muchie b) {
    return a.c < b.c;
}

void citire() {
    f >> n >> m;
    for(int i=1; i<=m; i++)
        f >> Muchii[i].s >> Muchii[i].d >> Muchii[i].c;
    for(int i=1; i<=n; i++) {
        tati[i] = i;
        rang[i] = 1;
    }
}

int Find(int nod) {
    if(nod != tati[nod])
        tati[nod] = Find(tati[nod]);
    return tati[nod];
}

int Merge(int s, int d) {
    if(rang[s] < rang[d]) {
        tati[s] = d;
    } else if(rang[d] < rang[s]) {
        tati[d] = s;
    } else {
        tati[s] = d;
        rang[s]++;//
    }
}

void Kruskal() {
    for(int i=1; i<=m; i++) {
        int ts = Find(Muchii[i].s);
        int td = Find(Muchii[i].d);

        if(ts != td) {
            Merge(ts, td);
            Sol[++k].first = Muchii[i].s;
            Sol[k].second = Muchii[i].d;
            s += Muchii[i].c;
        }
    }
}

int main() {
    citire();
    sort(Muchii+1, Muchii+m+1, cmpCost);

    Kruskal();

    g << s << '\n';
    g << k << '\n';
    for(int i=1; i<=k; i++)
        g << Sol[i].first << ' ' << Sol[i].second << '\n';

    return 0;
}