Cod sursa(job #3269843)

Utilizator juniorOvidiu Rosca junior Data 21 ianuarie 2025 08:24:12
Problema Arbore partial de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
#include <iostream>

using namespace std;

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

struct muchie {
    int inc;
    int sf;
    int cost;
};

const int LIM_M = 400001;
const int LIM_N = 200001;

muchie sm[LIM_M], arbore[LIM_N]; // sirul muchiilor
int n, m, comp[LIM_N], ca, nms, csfm, j;

void citire() {
    int i;

    fin >> n >> m;
    for (i = 1; i <= m; i++)
        fin >> sm[i].inc >> sm[i].sf >> sm[i].cost;
}

void initcomp() {
    int i;

    for (i = 1; i <= n; i++)
        comp[i] = i;
}

void sortm() {
    int i;
    bool AmSchimbat;
    muchie aux;

    do {
        AmSchimbat = false;
        for (i = 1; i <= m - 1; i++)
            if (sm[i].cost > sm[i + 1].cost) { // Nu sunt in ordinea corecta
                aux = sm[i];
                sm[i] = sm[i + 1];
                sm[i + 1] = aux;
                AmSchimbat = true;
            }
    } while (AmSchimbat);
}

void rezultat() {
    fout << ca << '\n' << n - 1 << '\n';
    for (int i = 1; i <= nms; i++) // pentru toate muchiile selectate
        fout << arbore[i].inc << ' ' << arbore[i].sf << '\n';
}

int main() {
    int i;

    citire();
    initcomp();
    // arata_comp();
    sortm();
    for (i = 1; nms <= n - 2; i++)
        if (comp[sm[i].inc] != comp[sm[i].sf]) { // Extremitatile muchiei curente sunt in componente conexe diferite.
            nms++;
            arbore[nms] = sm[i];
            ca += sm[i].cost;
            csfm = comp[sm[i].sf]; // Retinem numarul de componenta al sfarsitului muchiei.
            for (j = 1; j <= n; j++)
                if (comp[j] == csfm) // Schimbam numarul de componenta?
                    comp[j] = comp[sm[i].inc];
        }
    rezultat();
}