Cod sursa(job #340628)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 15 august 2009 19:56:48
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <stdio.h>
#define Nmax 100020

int n,m,i,cod,x,y;
int tata[Nmax],rank[Nmax];

void merge(int x,int y){
	if( rank[x] > rank[y] )
   	tata[y]=x;
   else tata[x]=y;

   if(rank[x] == rank[y]) rank[y]++;
}

int find(int x){
	int r,y;
	for( r=x; tata[r] !=r; r=tata[r]);

   while(tata[x] != x){
   	y = tata[x];
      tata[x] =r;
      x= y;
   }

   return r;
}

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

   for(i=1;i<=n;++i){
   	rank[i]=1;
      tata[i]=i;
   }

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

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