Cod sursa(job #1704536)

Utilizator GreeDGlavan George Florian GreeD Data 18 mai 2016 22:43:39
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>

using namespace std;

vector<pair <int,pair<int,int> > > v1;

vector<pair <int,pair<int,int> > > v2;

vector<pair<int,int> > grandPadre;

int elGrandPadre(int i){
    if(grandPadre[i].first==i)
        return i;
    grandPadre[i].first=elGrandPadre(grandPadre[i].first);
    return grandPadre[i].first;
}

void imprietenire(int i,int j){
     int a=elGrandPadre(i);
    int b=elGrandPadre(j);


    if(grandPadre[a].second>grandPadre[b].second){
        grandPadre[b].first=a;


    }else if(grandPadre[a].second<grandPadre[b].second){
        grandPadre[a].first=b;


    }else{


        grandPadre[a].first=b;
        grandPadre[b].second++;
    }
}

bool c(pair<int,pair<int,int> > i,pair<int,pair<int,int> > j){
    return i.first<j.first;
}

int main()
{
    ifstream f("apm.in");
    ofstream g("apm.out");

    long long int n,m,cost,x,y;
    long long int cT=0;
    f>>n>>m;


    for(int i=0;i<m;i++){
        f>>x>>y>>cost;

        v1.push_back(make_pair(cost,make_pair(x,y)));
    }

    for(int i=0;i<=n;i++){
        grandPadre.push_back(make_pair(i,1));

    }
    sort(v1.begin(),v1.end(),c);

    ///*
    for( int i=0;i<m; ++i){
        if(elGrandPadre(v1[i].second.first)!=elGrandPadre(v1[i].second.second)){

            imprietenire(v1[i].second.first,v1[i].second.second);
            cT+=v1[i].first;
            v2.push_back(v1[i]);
        }
    }
    g<<cT<<'\n'<<n-1<<'\n';
    for(vector<pair<int,pair<int,int> > >::iterator it=v2.begin(); it<v2.end(); ++it){
        g<<(*it).second.first<<" "<<(*it).second.second<<'\n';
    }
    //*/
    return 0;
}