Cod sursa(job #1597843)

Utilizator georgeliviuPereteanu George georgeliviu Data 12 februarie 2016 13:15:46
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

#define Nmax 200010
int p[Nmax] ;
int n , m , x , y , c , s ;
struct graf
{
    int inc , sf , cost ;
};

graf v[2 * Nmax] ;
vector <graf> sol;

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

int find_node ( int nod )
{
    if ( p[nod] == nod ) return nod;
    p[nod] = find_node(p[nod]);
    return p[nod];
}

void union_node ( int x , int y )
{
    p[find_node(x)] = p[find_node(y)] ;
}

bool cmp ( graf a , graf b )
{
    return a.cost < b.cost ;
}

int main()
{
    freopen("apm.in","r",stdin);
    freopen("apm.out","w",stdout);

    scanf("%d %d",&n,&m) ;
    for ( int i = 1 ; i <= m ; ++i )
    {
        scanf("%d %d %d",&v[i].inc,&v[i].sf,&v[i].cost) ;
    }
    init();
    sort(&v[1],&v[m+1],cmp);
    for ( int i = 1 ; i <= m ; i++ )
    {
        if ( find_node(v[i].inc) != find_node(v[i].sf) )
        {
            union_node(v[i].inc,v[i].sf) ;
            s += v[i].cost ;
            sol.push_back(v[i]);
        }
    }
    printf("%d\n",s) ;
    printf("%d\n",sol.size());
    for (int i = 0 ; i < sol.size() ; ++i )
    {
        printf("%d %d\n",sol[i].inc,sol[i].sf) ;
    }
}