Cod sursa(job #2304064)

Utilizator AndreiSorin26012001Cirpici Andrei Sorin AndreiSorin26012001 Data 17 decembrie 2018 14:39:08
Problema Arbore partial de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>
#define DIM 100005
#define cost first
#define a second.first
#define b second.second
using namespace std;

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

int n, m, x, y, c, cost_sol;
pair< int, pair<int, int> > v[DIM];
vector< pair<int, int> > muchii;

int t[DIM];
int rx, ry, legaturi;

int radacina( int nod )
{
    while( t[nod] > 0 )
        nod = t[nod];
    return nod;
}

int main()
{
    in>>n>>m;
    for( int i = 1; i <= m; i++ )
    {
        in>>x>>y>>c;
        v[i] = make_pair( c, make_pair(x, y) );
    }

    sort( v + 1, v + m + 1 );

    for( int i = 1; i <= n; i++ )
        t[i] = -1;

    for( int i = 1; i <= m; i++ )
    {
        rx = radacina( v[i].a );
        ry = radacina( v[i].b );

        if( rx != ry )
        {
            legaturi++;
            cost_sol += v[i].cost;

            if( t[rx] < t[ry] )
            {
                t[rx] += t[ry];
                t[ry] = rx;
            }
            else
            {
                t[ry] += t[rx];
                t[rx] = ry;
            }

            muchii.push_back( make_pair( v[i].a, v[i].b ) );
        }
    }

    out<<cost_sol<<"\n"<<legaturi<<"\n";
    for( auto i : muchii )
        out<<i.first<<" "<<i.second<<"\n";

    return 0;
}