Cod sursa(job #2376071)

Utilizator Username01Name Surname Username01 Data 8 martie 2019 13:32:16
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#include <algorithm>

using namespace std;
FILE *f,*g;

int tata[200002],rang[200002];

struct bla
{
    int x,y,c;
}v[200002];
bool how(bla A, bla B)
{
    return (A.c<B.c);
}
struct
{
    int x,y;
}q[200002];

int root(int nod)
{
    while(nod!=tata[nod])
        nod=tata[nod];
    return nod;
}
void unite(int ra, int rb)
{
    if(rang[ra]<rang[rb])
        tata[ra]=rb;
    else
        tata[rb]=ra;
    if(rang[ra]==rang[rb])
        ++rang[ra];
}
int main()
{
    f=fopen("apm.in","r");
    g=fopen("apm.out","w");
    int n,m;
    fscanf(f,"%d %d",&n,&m);
    for(int i=1;i<=m;++i)
        fscanf(f,"%d %d %d",&v[i].x,&v[i].y,&v[i].c);
    sort(v+1,v+m+1,how);
    int a,b,ra,rb;
    for(int i=1;i<=n;++i)
        tata[i]=i;
    int nr=0,cost=0;

    for(int i=1;i<=m;++i)
    {
        a=v[i].x;
        b=v[i].y;
        ra=root(a);
        rb=root(b);
        if(ra!=rb)
        {
            cost+=v[i].c;
            unite(ra,rb);
            q[++nr]={a,b};
        }
    }
    fprintf(g,"%d\n%d\n",cost,nr);
    for(int i=1;i<=nr;++i)
    {
        fprintf(g,"%d %d\n",q[i].x,q[i].y);
    }
    return 0;
}