Cod sursa(job #3369993)

Utilizator TudorPetTudor Petrescu TudorPet Data 22 octombrie 2026 22:37:16
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
// https://www.infoarena.ro/problema/apm
// rezolvata cu prim - COMPLEXITATE SUPER MARE, ar ocupa aproximativ 160 GB de memorie!!
#include <algorithm>
#include <fstream>
#include <climits>
#include <vector>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
const int MAX_N = 200000, MAX_M = 400000, INF = INT_MAX;
struct muchie {
    int c, x, y;
} e[MAX_M];
int N, M, T[MAX_N], cost;
vector <pair <int, int> > Sol;

bool cmp (muchie a, muchie b) {
    return a.c < b.c;
}
int radacina(int nod) { // Determina radacina fiecarui nod
    if (T[nod] != nod)
        T[nod] = radacina(T[nod]);
    return T[nod];
}

int main() {
    fin >> N >> M;
    for (int i = 0; i < M; i++) {
        int x, y, c;
        fin >> x >> y >> c;
        e[i].c = c, e[i].x = x, e[i].y = y;
    }
    sort(e, e + M, cmp); // Sort muchii
    for (int i = 0; i <= N; i++) // Fiecare nod are un arbore la inceput (din el insusi), deci tata[i] = i
        T[i]=i;
    int cost = 0;

    for (int i = 0; i < M; i++){
        int n1 = e[i].x;
        int n2 = e[i].y;
        if (radacina(n1) != radacina(n2)){
            cost += e[i].c;
            Sol.push_back(make_pair(n1, n2));
            T[T[n2]] = T[n1];
        }
    }
    fout << cost << '\n';
    fout << Sol.size() << '\n';
    for (int i = 0; i < Sol.size(); i++) {
        fout << Sol[i].first << ' ' << Sol[i].second << '\n';
    }

    return 0;
}