Cod sursa(job #1665404)

Utilizator axelteoTeodor Dutu axelteo Data 26 martie 2016 22:11:23
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>
using namespace std;
FILE *in,*out;
int h[100001],dad[100001];
int Find(int x);
void Union(int x,int y);
int main()
{
    in=fopen("disjoint.in","r");
    out=fopen("disjoint.out","w");
    int n,q,i,x,y,task;
    fscanf(in,"%d%d",&n,&q);
    for(i=1;i<=n;++i)h[i]=1;
    for(i=1;i<=q;++i)
    {
        fscanf(in,"%d%d%d",&task,&x,&y);
        if(task==2)
        {
            if(Find(x)==Find(y))fprintf(out,"DA\n");
            else fprintf(out,"NU\n");
        }
        else Union(Find(x),Find(y));
    }
    fclose(in);fclose(out);
    return 0;
}
int Find(int x)
{
    int y=x,root;
    while(dad[y])y=dad[y];
    root=y;
    while(dad[x])
    {
        y=dad[x];
        dad[x]=root;
        x=y;
    }
    return root;
}
void Union(int x,int y)
{
    if(h[x]>h[y])dad[y]=x;
    else dad[x]=y;
    if(h[x]==h[y])++h[y];

}