Cod sursa(job #2278890)

Utilizator alexconstantinalexandru constantin alexconstantin Data 8 noiembrie 2018 17:53:12
Problema Arbore partial de cost minim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>
using namespace std;
int n,m,t[200005],muchii,sum;
struct muchie
{
    int nod1,nod2,cost;
} vect[400005],sol[400005];
bool cmp(muchie A,muchie B)
{
    return A.cost<B.cost;
}
int sef(int nod)
{
    if(nod==t[nod])
        return nod;
    return t[nod]=sef(t[nod]);

}
void join(int nod1,int nod2)
{
    t[sef(nod2)]=sef(nod1);
}
int main()
{
    int x,y;
    FILE* in=fopen("apm.in","r");
    FILE* out=fopen("apm.out","w");
    fscanf(in,"%d",&n);
    fscanf(in,"%d",&m);
    for(int i =1; i<=m; i++)
    {
        fscanf(in,"%d%d%d",&vect[i].nod1,&vect[i].nod2, &vect[i].cost);
    }
    sort(vect+1,vect+m+1,cmp);
    for(int i=1; i<=n; i++)
        t[i]=i;

    for(int i=1; i<=m&&muchii<=n-1; i++)
    {
//        printf("%d", i);
        if(sef(vect[i].nod1)!=sef(vect[i].nod2))
        {
            sum+=vect[i].cost;
            muchii++;
            join(vect[i].nod1,vect[i].nod2);
            sol[i].nod1=vect[i].nod1;
            sol[i].nod2=vect[i].nod2;
        }
    }
    fprintf(out,"%d\n%d\n",sum, muchii);
    for(int i =1;i<=muchii;i++)
    {
        fprintf(out,"%d %d\n",sol[i].nod1,sol[i].nod2);
    }
}