Cod sursa(job #2039540)

Utilizator Alex18maiAlex Enache Alex18mai Data 14 octombrie 2017 17:15:15
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

/*ifstream cin ("input");
ofstream cout ("output");*/

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

struct edge{
    int a , b , val;
} edges [400100] ;

vector <edge> ans;
int tata [200100];

int super_tata (int node){
    if (tata[node] != node){
        tata[node] = super_tata(tata[node]);
    }
    else{
        return node;
    }
    return tata[node];
}

void unire (int a , int b){
    super_tata(b);
    super_tata(a);
    tata[tata[b]] = tata[a];
}

bool cmp(edge a , edge b){
    return a.val < b.val;
}

int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int nodes , nr_edges;
    cin>>nodes>>nr_edges;
    int pos = 0;
    for (int i=1; i<=nr_edges; i++){
        edge now;
        cin>>now.a>>now.b>>now.val;
        edges[++pos] = now;
    }

    sort (edges + 1, edges + nr_edges + 1 , cmp);

    for (int i=1; i<=nodes; i++){
        tata[i] = i;
    }

    int cont = 0;

    for (int i=1; i<=nr_edges; i++){
        if (super_tata(edges[i].a) != super_tata(edges[i].b)){
            cont += edges[i].val;
            ans.push_back(edges[i]);
            unire(edges[i].a , edges[i].b);
        }
    }

    cout<<cont<<'\n';
    cout<<ans.size()<<'\n';
    for (auto &x : ans){
        cout<<x.a<<" "<<x.b<<'\n';
    }

    return 0;
}