Cod sursa(job #2374384)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 7 martie 2019 18:19:27
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>

using namespace std;

struct edge
{
    int x,y,c;
};

edge muc[400010];
pair<int,int> v[400010];
int rad[200010];

int cmp(edge a,edge b)
{
    return a.c<b.c;
}

int radacina(int x)
{
    int y=x;
    while(y!=rad[y]) y=rad[y];
    while(x!=y)
    {
        int aux=rad[x];
        rad[x]=y;
        x=aux;
    }
    return x;
}

void unite(int x,int y)
{
    x=radacina(x);y=radacina(y);
    rad[x]=y;
}

int main()
{
    freopen("apm.in","r",stdin);
    freopen("apm.out","w",stdout);
    int n,m,x,y,c,l=0,ans=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        muc[i]={x,y,c};
    }
    sort(muc+1,muc+m+1,cmp);
    for(int i=1;i<=n;i++) rad[i]=i;
    for(int i=1;i<=m;i++)
        if(radacina(muc[i].x)!=radacina(muc[i].y))
        {
            unite(muc[i].x,muc[i].y);
            v[++l]={muc[i].x,muc[i].y};
            ans+=muc[i].c;
            if(l==n-1) break;
        }
    printf("%d\n%d\n",ans,l);
    for(int i=1;i<=l;i++) printf("%d %d\n",v[i].first,v[i].second);
    return 0;
}