Cod sursa(job #273984)

Utilizator pandaemonAndrei Popescu pandaemon Data 9 martie 2009 12:14:41
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<stdio.h>
#include<iostream.h>

#define NMAX 100000

int n,m,op,x,y;

int rad[NMAX+5],rang[NMAX+5];

int find_rad(int nod)
{
  int radacina=nod,y;

  while(rad[radacina]!=radacina) radacina=rad[radacina];

  while(rad[nod]!=nod)  { y=rad[nod]; rad[nod]=radacina; nod=y; }

  return radacina;  }

int unite(int rad1,int rad2)
{
 if(rang[rad1] > rang[rad2]) rad[rad2]=rad1;
 else                        rad[rad1]=rad2;

 if(rang[rad1]==rang[rad2])  rang[rad2]+=1;

}

int main()
{
  freopen("disjoint.in","r",stdin);
  freopen("disjoint.out","w",stdout);

  scanf("%d %d",&n,&m);

  for(int i=1; i<=n; i++) rad[i]=i, rang[i]=1;

  while(m--)
  {
  scanf("%d %d %d",&op,&x,&y);

  if(op==1) unite( find_rad(x), find_rad(y) );
  else      if( find_rad(x)==find_rad(y) ) printf("DA\n");
	    else printf("NU\n");
  }

  return 0;

}