Cod sursa(job #2767071)

Utilizator gasparrobert95Gaspar Robert Andrei gasparrobert95 Data 4 august 2021 18:06:29
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
int n, m, sum, tata[200005], fv[200005];
vector < tuple <int, int, int> > v;
vector < pair <int, int> > rez;

int Find (int x) {
    if (tata[x] == x)
        return x;
    tata[x] = Find(tata[x]);
    return tata[x];
}

void Union (int x, int y) {
    int radx = Find(x), rady = Find(y);
    if (fv[radx] < fv[rady]) {
        fv[rady] += fv[radx];
        tata[radx] = rady;
    }
    else {
        fv[radx] += fv[rady];
        tata[rady] = radx;
    }
    return;
}

int main() {
    fin >> n >> m;
    for (int i = 1; i <= n; ++i)
        tata[i] = i, fv[i] = 1;
    for (int i = 1; i <= m; ++i) {
        int a, b, c;
        fin >> a >> b >> c;
        v.push_back(make_tuple(c, a, b));
    }
    sort(v.begin(), v.end());
    for (int i = 0; i < m; ++i) {
        int a = get<1>(v[i]), b = get<2>(v[i]), c = get<0>(v[i]);
        if (Find(a) != Find(b)) {
            Union(a, b);
            rez.push_back({a, b});
            sum += c;
        }
    }
    fout << sum << "\n" << rez.size() << "\n";
    for (int i = 0; i < rez.size(); ++i)
        fout << rez[i].first << " " << rez[i].second << "\n";
    return 0;
}