Cod sursa(job #2240416)

Utilizator BogdanAlexandruBogdan-Alexandru Dig BogdanAlexandru Data 13 septembrie 2018 11:30:08
Problema Arbore partial de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
FILE *f,*g;
int tata[200005],rang[200005];
struct Muchii
{
    int a,b,c;
};
struct Arbore
{
    int lin,col;
};
Arbore tt[400040];
Muchii vv[400040];
bool Criteriu(Muchii x, Muchii y)
{
    if(x.c!=y.c)return (x.c<y.c);
}
int VerMuc(int nod)
{
    if(tata[nod]!=nod)
        tata[nod]=VerMuc(tata[nod]);
    return tata[nod];
}
void Uneste(int aa, int bb)
{
    //if(aa==bb)
        //return;
    if(rang[aa]<rang[bb])
        tata[aa]=bb;
    else
        tata[bb]=aa;
    if(rang[aa]==rang[bb])
        ++rang[aa];
}
int main()
{
    f=fopen("apm.in","r");g=fopen("apm.out","w");
    int n,m,i,j,x,y,cos,sum=0,al,be;
    fscanf(f,"%d %d",&n,&m);
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d %d %d",&x,&y,&cos);
        vv[i].a=x,vv[i].b=y,vv[i].c=cos;
        if(i<=n)
            tata[i]=i;
    }
    sort(vv+1,vv+1+m,Criteriu);
    cos=0;
    int aa,bb;
    for(i=1;i<=m;i++)
    {
        x=vv[i].a,y=vv[i].b;
        aa=VerMuc(x);
        bb=VerMuc(y);
        if(aa!=bb)
        {
            sum+=vv[i].c;
            Uneste(aa,bb);
            tt[++cos].lin=x;tt[cos].col=y;
        }
    }
    fprintf(g,"%d\n%d\n",sum,cos);
    for(i=1;i<=cos;i++)fprintf(g,"%d %d\n",tt[i].lin,tt[i].col);
    fclose(f),fclose(g);
    return 0;
}