Cod sursa(job #894559)

Utilizator lucian666Vasilut Lucian lucian666 Data 26 februarie 2013 22:01:10
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb



#include<fstream>
#include<algorithm>
#include<utility>


#define NN 400009
#define f first
#define s second
#define mp make_pair

using namespace std;
ofstream out("apm.out");

int n , m , T[NN] , poz[NN] , sol , sum ;

pair < pair < int , int > , int > v[NN];

bool cmp( pair < pair < int , int > , int > i , pair <  pair < int , int > , int > j )
{
    return i.s < j.s ;
}


void read();
void prep();
int find( int x );
void uneste( int x , int y );
void Kruskal();
void wrs();

int main()
{
    read();
    Kruskal();
    wrs();


    return 0;
}

void read()
{
    ifstream in("apm.in");

    in >> n >> m;

    for( int x , y , cost , i=1 ; i<=m ; i++)
    {
        in >> x >> y >> cost;
        v[i] = mp ( mp ( x , y ) , cost ) ;
    }

    prep();
}

void prep()
{
    for( int i=1 ; i<=n ; i++)
        T[i] = i;
}


int find( int x )
{
    if ( x != T[x] )
        return T[x] = find( T[x] );
    return x;
}

void uneste( int x , int y)
{

    int m1 , m2;

    m1 = find( x );
    m2 = find( y );

    T[ m2 ] = m1;
}


void Kruskal()
{
    sort( v + 1 , v + m + 1 , cmp );

    pair < pair < int , int > , int > I;

    for( int i=1 ; i<=m ; i++ )
    {
        I = v[i];

    int x , y , cost;

    x = (I.f).f;
    y = (I.f).s;
    cost = I.s;

    if ( find(x) != find(y) )
    {
        poz[ ++sol ] = i;
        sum+=cost;
        uneste(x,y);
    }
    }
}

void wrs()
{
    out << sum << '\n';

    out << sol << '\n';
    for( int i=1 ; i<=sol;i++)
        out << (v[ poz[i] ].f).f << " " << (v[ poz[i] ].f).s << " " << v[ poz[i] ].s << '\n';
}