Cod sursa(job #243464)

Utilizator zbarniZajzon Barna zbarni Data 13 ianuarie 2009 00:32:53
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include<stdio.h>
#define nmax 100005
int fej[nmax],rg[nmax];
int n,m;

int go (int x)
 {
  int y,r;
  for (r=x;fej[r]!=r;r=fej[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);
  scanf("%d%d",&n,&m);
  int i,c,x,y;
  for (i=1;i<=n;++i)
    {
     fej[i]=i;
     rg[i]=1;
    }
  for (i=1;i<=m;++i)
   {
    scanf("%d%d%d",&c,&x,&y);
    if (c==1)
      egyesit(go(x),go(y));
    else
      if (go(x)==go(y))
	printf("DA\n");
      else
	printf("NU\n");
   }
  return 0;
 }