Cod sursa(job #1608072)

Utilizator roxana.aeleneiAelenei Roxana roxana.aelenei Data 21 februarie 2016 20:04:00
Problema Arbore partial de cost minim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <cstdio>
#include <algorithm>
using namespace std;
struct edg
{
    int u,v,val;
}a[400002];

int n,m, t[200002],cnt;
bool viz2[400002];

bool cmp(edg c, edg b)
{
    return c.val < b.val;
}

inline int FindSet (int x)
{
    while (x!=t[x])
        x=t[x];
    return x;
}

inline void UnionSet (int x, int y)
{
    t[FindSet(x)]=FindSet(y);
}

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

    int sum=0;
    scanf("%d%d", &n, &m);

    for(int i=1; i<=m; i++)
        scanf("%d%d%d", &a[i].u, &a[i].v, &a[i].val);

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

    sort(a+1, a+m+1, cmp);

    for(int i=1; i<=m && cnt< n-1; i++)
            if(FindSet(a[i].u)!=FindSet(a[i].v))
    {
        viz2[i]=1;
        UnionSet(a[i].u,a[i].v);
        sum+=a[i].val;
        cnt++;
    }

    printf("%d\n%d\n", sum,cnt);


    for(int i=1; i<=m; i++)
        if(viz2[i])
           printf("%d %d\n", a[i].u, a[i].v);
    return 0;
}