Cod sursa(job #1515502)

Utilizator andreii1Ilie Andrei andreii1 Data 1 noiembrie 2015 18:01:18
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <cstdio>

using namespace std;

FILE *f=fopen("disjoint.in","r");
FILE *g=fopen("disjoint.out","w");

int n,m;
int TT[100010],h[100010];
int interogate(int x)
{
    int i,j,aux;
    for(i=x;TT[i]!=i;i=TT[i]);
    while(TT[x]!=x)
    {
        aux=x;
        x=TT[x];
        TT[aux]=i;
    }
    return i;
}

void joint(int x,int y)
{
    if(h[x]>h[y]) TT[y]=x;
    else if(h[x]<h[y])TT[x]=y;
    else {TT[x]=y;h[y]++;}
}

int main()
{
    int i,c,x,y;
    fscanf(f,"%d %d",&n,&m);
    for(i=1;i<=n;i++){TT[i]=i;h[i]=1;}
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d %d %d",&c,&x,&y);
        if(c==1) joint(x,y);
        else
            if(interogate(x)==interogate(y))fprintf(g,"DA\n");
            else fprintf(g,"NU\n");
    }
    fclose(f);
    fclose(g);
    return 0;
}