Cod sursa(job #3267093)

Utilizator BuruianaRaresAndreiBuruiana Rares Andrei BuruianaRaresAndrei Data 11 ianuarie 2025 09:31:13
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, parent[200005], sz[200005];
struct edging {
    int fs, sd, w;
}edge[400005];
vector<int> use;
int total;

void make_set(int crt) {
    parent[crt] = crt;
    sz[crt] = 1;
}

int find_parent(int crt) {
    if(crt == parent[crt])
        return crt;
    return parent[crt] = find_parent(parent[crt]);
}

void unite(int a, int b) {
    a = find_parent(a);
    b = find_parent(b);
    if(a == b)
        return;
    if(sz[a] < sz[b])
        swap(a, b);
    parent[b] = a;
    sz[a] += sz[b];
}

bool customSort(edging a, edging b) {
    return a.w < b.w;
}

int main() {
    int n, m; in >> n >> m;
    for(int i = 1; i <= n; i++) {
        make_set(i);
    }
    for(int i = 1; i <= m; i++) {
        in >> edge[i].fs >> edge[i].sd >> edge[i].w;
    }
    sort(edge + 1, edge + m + 1, customSort);
    for(int i = 1; i <= m; i++) {
        if(find_parent(edge[i].fs) == find_parent(edge[i].sd))
            continue;
        unite(edge[i].fs, edge[i].sd);
        total += edge[i].w;
        use.push_back(i);
    }
    out << total << '\n';
    out << use.size() << '\n';
    for(auto i : use) {
        out << edge[i].fs << ' ' << edge[i].sd << '\n';
    }
    return 0;
}