Cod sursa(job #1145741)

Utilizator NikitaUtiuNichita Utiu NikitaUtiu Data 18 martie 2014 13:35:12
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
 
struct muchie {
    int a, b;
    int cost;
};
 
inline bool comp(muchie a, muchie b) {
    return a.cost < b.cost;
}
 
int n, m;
int mult[200001];
int adanc[200001];
muchie muchii[400001];
int arbore[200001];
 
int find(int nod) {
    if(mult[nod] != nod)
        mult[nod] = find(mult[nod]);
    return mult[nod];
}
 
inline void add(int a, int b) {
    int rada = find(a);
    int radb = find(b);
    if(adanc[rada] > adanc[radb])
        mult[radb] = mult[rada];
    else if(adanc[rada] < adanc[radb])
        mult[rada] = mult[radb];
    else {
        mult[rada] = mult[radb];
        adanc[radb]++;
    }
}
 
int main(void) {
    ifstream fin("apm.in");
    fin >> n >> m;
     
    for(int i = 0; i < m; ++i)
        fin >> muchii[i].a >> muchii[i].b >> muchii[i].cost;
    fin.close();
     
    int rasp = 0;
    sort(muchii, muchii + m, comp);
    for(int i = 1; i <= n; ++i) {
        mult[i] = i;
        adanc[i] = 0;
    }
     
    for(int i = 0, ind = 0; ind < n - 1; ++i) {
        if(find(muchii[i].a) != find(muchii[i].b)) {
            rasp += muchii[i].cost;
            add(muchii[i].a, muchii[i].b);
            arbore[ind++] = i;
        }
    }
     
    ofstream fout("apm.out");
    fout << rasp << '\n' << n - 1 << '\n';
    for(int i = 0; i < n - 1; ++i)
        fout << muchii[arbore[i]].a << ' ' << muchii[arbore[i]].b << '\n';
    fout.close();
}