Cod sursa(job #372969)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 12 decembrie 2009 12:25:13
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

struct muchie {
    int x, y, cost;
};
muchie v[400009];

int bst,tata[200009],grad[200009],n,m;
char fol[400009];

int cmp (muchie a,muchie b)
{
    return (a.cost<b.cost);
}

int gaseste(int p)
{
    if (tata[p] != p)
        tata[p] = gaseste(tata[p]);
    return tata[p];
}

int uneste (int p1,int p2)
{
    p1 = gaseste(p1);
    p2 = gaseste(p2);
    if (p1 == p2)
        return 0;
    if(grad[p1]<grad[p2])
    {
        tata[p1]=p2;
        grad[p2]+=grad[p1];
    }
    else
    {
        tata[p2]=p1;
        grad[p1]+=grad[p2];
    }
    return 1;
}
int main ()
{
    int i;
    freopen("apm.in","r",stdin);
    freopen("apm.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
        scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].cost);
    sort(v+1,v+m+1,cmp);
    for(i=1;i<=n;i++)
    {
        tata[i]=i;
        grad[i]=1;
    }
    for(i=1;i<=m;i++)
        if (uneste(v[i].x,v[i].y))
        {
            bst += v[i].cost;
            fol[i] = 1;
        }
        
    printf("%d\n%d\n", bst, n-1);
    for (i=1;i<=m;i++)
        if(fol[i]==1)
            printf("%d %d\n",v[i].x,v[i].y);
    return 0;
}