Cod sursa(job #2131954)

Utilizator adiXMGemene Adrian adiXM Data 15 februarie 2018 10:37:12
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
const int nMax = 200005;
struct Val{
    int x, y, c;
};
Val a[2 * nMax];
int t[nMax];
pair <int, int> re[2 * nMax];
inline void Union(int x, int y) {
    t[x] = y;
}
inline int Find(int x) {
    if(t[x] != x) {
        t[x] = Find(t[x]);
    }
    return t[x];
}
inline bool cmp(const Val &A, const Val &B) {
    return A.c < B.c;
}
int main()
{
    int n, m;
    f >> n >> m;
    for(int i = 1; i <= m; i++) {
        f >> a[i].x >> a[i].y >> a[i].c;
    }
    sort(a + 1, a + m + 1, cmp);
    for(int i = 1; i <= n; i++) {
        t[i] = i;
    }
    int ans = 0, cnt = 0;
    for(int i = 1; i <= m; i++) {
        int fi = Find(a[i].x);
        int se = Find(a[i].y);
        if(fi == se) {
            continue;
        }
        cnt++;
        Union(fi, se);
        ans += a[i].c;
        re[cnt] = {a[i].x, a[i].y};
    }
    g << ans << "\n";
    g << cnt << "\n";
    for(int i = 1; i <= cnt; i++) {
        g << re[i].first << " " << re[i].second << "\n";
    }
    return 0;
}