Cod sursa(job #566962)

Utilizator irene_mFMI Irina Iancu irene_m Data 29 martie 2011 15:41:55
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#define MaxN 100005
#define infile "disjoint.in"
#define outfile "disjoint.out"

int t[MaxN],r[MaxN];
int N,M;
int op,x,y,r1,r2;

int radacina(int nod)
{
      if(!t[nod])
            return nod;
      return radacina(t[nod]);
}

void parcurge(int nod,int R)
{
      if(t[nod])
      {
            parcurge(t[nod],R);
            t[nod]=R;
      }
}

int main()
{
      freopen(infile,"r",stdin);
      freopen(outfile,"w",stdout);

      scanf("%d%d",&N,&M);

      for(;M;M--)
      {
            scanf("%d%d%d",&op,&x,&y);
            if(op==1)
            {
                  r1=radacina(x);
                  r2=radacina(y);
                  if(r1>=r2)
                  {
                        t[r2]=r1;
                        if(r[r2]+1>r[r1])
                              r[r1]=r[r2]+1;
                  }
                  else
                  {
                        t[r1]=r2;
                        if(r[r1]+1>r[r2])
                              r[r2]=r[r1]+1;
                  }
            }
            else
            {
                  r1=radacina(x);
                  r2=radacina(y);
                  if(r1==r2)
                        printf("DA\n");
                  else
                        printf("NU\n");
                  parcurge(x,r1);
                  parcurge(y,r2);
            }
      }

      fclose(stdin);
      fclose(stdout);
      return 0;
}