Cod sursa(job #2859807)

Utilizator mihaicrisanMihai Crisan mihaicrisan Data 1 martie 2022 22:43:20
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin ("apm.in");
ofstream fout("apm.out");

const int dim = 400005;

struct Muchie {
    int x, y, z;
}v[dim];

int n, m, cost, cnt;
int x, y, z;
int t[200005];
int rang[200005];
pair<int, int> sol[200005];

bool cmp(Muchie a, Muchie b) {
    return a.z < b.z;
}

int radacina(int nod) {
    while (t[nod] != -1)
        nod = t[nod];
    return nod;
}

void unire(int radx, int rady) {
    if (rang[radx] > rang[rady])
        t[rady] = radx;
    else
        t[radx] = rady;

    if (rang[radx] == rang[rady])
        rang[rady]++;
}

inline void apm() {
    for (int i = 1; i <= n; i++) {
        t[i] = -1;
        rang[i] = 1;
    }

    for (int i = 1; i <= m; i++) {
        int radx = radacina(v[i].x);
        int rady = radacina(v[i].y);

        if (radx != rady) {
            sol[++cnt] = {v[i].x, v[i].y};
            cost += v[i].z;
            unire(radx, rady);
        }
    }
}

int main(){
    fin >> n >> m;
    for (int i = 1; i <= m; i++) {
        fin >> v[i].x >> v[i].y >> v[i].z;
    }

    sort(v + 1, v + m + 1, cmp);

    apm();

    fout << cost << '\n';
    fout << cnt << '\n';
    for (int i = 1; i <= cnt; i++) {
        fout << sol[i].first << ' ' << sol[i].second << '\n';
    }
    return 0;
}