Cod sursa(job #1429462)

Utilizator CalinCojoFMI Cojocaru Calin George CalinCojo Data 6 mai 2015 14:19:17
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>



using namespace std;

const int MAX = 400010;

int X[MAX], Y[MAX], C[MAX], CLS [MAX], RG [ MAX ];
vector < int > IND , MUCHII ;



int findParent ( int x ){

    if ( x == CLS [ x ] )
        return x;

    CLS [ x ] = findParent ( CLS [ x ] );

}

void Union ( int x, int y ){

    x = findParent ( x );
    y = findParent ( y );

    if ( RG [ x ] < RG [ y ] )
        CLS [ x ] = y;
    else
        CLS [ y ] = x;

    if ( RG [ x ] == RG [ y ])
        RG [ x ]++ ;

}

bool myCmp ( int i , int j){

    return ( C [ i ] < C [ j ] ) ;

}

int main()
{
    int N , M , i = 0 ,cpyM , ANS = 0, SUM = 0;
    ifstream f("apm.in" , ios::in );
    ofstream g("apm.out" , ios::out);
    f>>N>>M;
    cpyM = M ;
    IND.resize ( M + 1) ;

    while (cpyM--){
        i++;
        f>>X [ i ]>> Y [ i ] >> C [ i ];
        IND [ i ] = i;
    }
    for ( i = 1 ; i <= N; i++){
        CLS [ i ] = i;
    }
    sort(IND.begin() + 1 , IND.begin() + M + 1, myCmp );

   for ( i = 1; i <= M ; i++){

        if ( findParent ( X [ IND [ i ] ] ) != findParent ( Y [ IND [ i ] ] ) ) {
            Union ( X [ IND [ i ] ] , Y [ IND [ i ] ] ) ;
            ANS++ ;
            SUM += C  [ IND [ i ] ] ;
            MUCHII.push_back ( IND [ i ] );
        }
   }

  g<<SUM<<"\n"<<ANS<<"\n";
  for ( i = 0 ; i < MUCHII.size() ; i++)
    g<<X [ MUCHII [ i ] ]<<" "<<Y [ MUCHII [ i ] ]<<"\n";




    return 0;
}