Cod sursa(job #772290)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 28 iulie 2012 23:13:16
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
/* paduri de multimi disjuncte */

#include<stdio.h>
using namespace std;

int n,i,j,nrq;
int m[100001];
int size[100001];

int find(int x)
{int r;
 r=x;
 while(m[r]!=r)
  r=m[r];
 
 int y;
 y=x;
 while(m[y]!=y)
  {m[y]=r;
   y=m[y];}  
 return r;
}
  
void unite(int x, int y)
{if(size[x]>size[y])
   m[y]=x;
 else
   m[x]=y;
 if(size[x]==size[y])   size[y]++;}  
    

int main()
{
freopen("disjoint.in", "r", stdin);
freopen("disjoint.out", "w", stdout);
scanf("%d %d", &n, &nrq);
int a,b,c;
for(i=1; i<=n; i++)
  {m[i]=i;  size[i]=1;} 
for(i=1; i<=nrq; i++)
 {scanf("%d %d %d", &c, &a, &b);
  if(c==1)
    unite(find(a),find(b));
  if(c==2)
    if(find(a)==find(b))
       printf("DA\n");
    else
       printf("NU\n");   
 }  
      
return 0;}