Cod sursa(job #233674)

Utilizator filipbFilip Cristian Buruiana filipb Data 18 decembrie 2008 20:59:40
Problema Arbore partial de cost minim Scor Ascuns
Compilator cpp Status done
Runda Marime 1.27 kb
#include <stdio.h>
#include <algorithm>
#include <vector>

using namespace std;

#define PII pair< pair<int, int>, int >
#define x first.first
#define y first.second
#define c second
#define pb push_back
#define mp make_pair
#define MMax 400004
#define NMax 200002

int N, M, up[NMax], rang[NMax], bst;
PII E[MMax];

bool cmp(const PII &a, const PII &b)
{ return a.c < b.c; }

void uneste(int xx, int yy)
{
     if (rang[xx] < rang[yy])
        up[xx] = yy;
     else
     {
         up[yy] = xx;
         rang[xx] += (rang[xx] == rang[yy]);
     }
}

int find_multime(int xx)
{
    if (xx != up[xx])
       up[xx] = find_multime(up[xx]);
    return up[xx];
}

int main()
{
    int i, u, v;
    
    freopen("apm.in", "r", stdin);
    freopen("apm.out", "w", stdout);
    
    scanf("%d %d", &N, &M);
    for (i = 0; i < M; ++i)
        scanf("%d %d %d", &E[i].x, &E[i].y, &E[i].c);
    sort(E, E+M, cmp);
    
    for (i = 1; i <= N; ++i)
        up[i] = i, rang[i] = 1;
    
    for (i = 0; i < M; ++i)
    {
        u = find_multime(E[i].x);
        v = find_multime(E[i].y);
        if (u != v)
        {
           uneste(u, v);
           bst += E[i].c;
        }
    }
    
    printf("%d\n", bst);
    
    return 0;
}