Cod sursa(job #568621)

Utilizator raica_cristiraica dumitru cristian raica_cristi Data 31 martie 2011 15:27:16
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <stdio.h>
#include<algorithm>
#include<vector>
#include<ctype.h>
#include<string.h>
#include<bitset>

#define dim 4*100010


using namespace std ;

struct apm
{
    int x, y , c ;
}a[dim];
bitset <dim> f;
int n,m , cnt;

int t[dim] , r[dim];
bitset <dim> viz;
void read()
{
    scanf("%d %d\n",&n,&m);
    for(int i=1 ; i<=m;i++)
        scanf("%d %d %d\n",&a[i].x , &a[i].y , &a[i].c );

}
int cmp (apm a , apm b )
{
    return a.c<b.c;
}
void afis8 (apm v[dim])
{
    for(int i=1 ; i<=m;i++)
    printf("%d %d %d\n" , v[i].x , v[i].y , v[i].c);
}
int find (int &x)
{
   while ( t[x]!=x )
        x = t[x] ;
    return t[x];
 }
int unite ( int &x , int &y )
{
    if ( r[x] < r[y] )
    t[x] = y ;
    else
    t[y] = x ;
    if ( r[x] == r[y] )
    r[x]++ ;
}
void afis ()
{
     for(int i=1 ; i<=m;i++)
    if ( viz[i] == true )
    {
        printf("%d %d\n",a[i].x , a[i].y);
    }
}
void solve()
{
    int nod_x,nod_y;
    int sum =0 ;

    read();
    sort (a+1 , a+m+1 , cmp ) ;
    //    afis8 (a) ;
    for(int i=1 ; i<=n;i++)
    t[i] = i ;
     for(int i=1 ; i<=m;i++)
    {
        nod_x = find ( a[i].x)  ;
        nod_y = find ( a[i].y ) ;
        if (find ( nod_x ) != find ( nod_y ))
        {
            unite ( nod_x , nod_y);
            cnt++;
            sum+= a[i].c ;
            viz[ i ] = true;
        }
        }
        printf("%d\n%d\n", sum,  cnt);
    afis () ;
}
int main ()
{
    freopen("apm.in","r",stdin);
    freopen("apm.out","w",stdout);
    solve();

    return 0;
}