Cod sursa(job #1077465)

Utilizator avaspAva Spataru avasp Data 11 ianuarie 2014 13:22:16
Problema Arbore partial de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<cstdio>
#include<algorithm>
using namespace std;

struct muchii{int a,b,c;};
muchii v[400001];

int n,m,arb[200001],cost,much,mini;

bool cmp(const muchii A, const muchii B){
    return A.c<B.c;
}

int main(){
    int i,j,ia,ib;
    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].a,&v[i].b,&v[i].c);
    }
    sort(v+1,v+m+1,cmp);
    for(i=1;i<=n;i++)
        arb[i]=i;
    cost=0;
    much=0;
    for(i=1;i<=m;i++){
        if(arb[v[i].a]!=arb[v[i].b]){//folosim muchia
            cost+=v[i].c;
            much++;
            mini=arb[v[i].a];
            if(arb[v[i].b]<mini)
                mini=arb[v[i].b];
            ia=arb[v[i].a];
            ib=arb[v[i].b];
            for(j=1;j<=n;j++)
                if(arb[j]==ia||arb[j]==ib)
                    arb[j]=mini;
            arb[v[i].a]=mini;
            arb[v[i].b]=mini;
        }
        else{
            v[i].a=-1;
        }
    }
    printf("%d\n%d\n",cost,much);
    for(i=1;i<=m;i++)
        if(v[i].a!=-1)
            printf("%d %d\n",v[i].a,v[i].b);
    return 0;
}