Cod sursa(job #238909)

Utilizator zbarniZajzon Barna zbarni Data 3 ianuarie 2009 17:11:13
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include<stdio.h>
#define nmax 100004
int rg[nmax],fej[nmax];

int go(int x)
 {
  int r,y;
  for (r=x;fej[r]!=r;++r)
     ;
  for ( ;fej[x]!=r; )
   {
    y=fej[x];
    fej[x]=r;
    x=y;
   }
  return r;
 }

void egyesit(int x,int y)
 {
  if (rg[x]>rg[y])
   fej[y]=x;
  else
   fej[x]=y;
  if (rg[x]==rg[y])
    rg[y]++;
 }



int main()
 {
  freopen("disjoint.in","r",stdin);
  freopen("disjoint.out","w",stdout);
  int n,m,cod,x,y,i;
  scanf("%d%d",&n,&m);

  for (i=1;i<=n;i++)
   {
    rg[i]=1;
    fej[i]=i;
   }

  for (i=1;i<=m;i++)
    {
     scanf("%d%d%d",&cod,&x,&y);
      if (cod==2)
       {
	if (go(x)==go(y))
	  printf("DA\n");
	else
	  printf("NU\n");
       }
      else
	   egyesit(go(x),go(y));
    }
  return 0;
 }