Cod sursa(job #251533)

Utilizator FlorianFlorian Marcu Florian Data 2 februarie 2009 21:30:31
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include<stdio.h>
#define M 100003
FILE*f=fopen("disjoint.in","r");
FILE*g=fopen("disjoint.out","w");
int tata[M], h[M];
int find(int x) // returnez radacina arborelui in care se afla x
 {
 int r,t,y;
 r=x;
 //caut radacina
 while(tata[r]) r=tata[r];
 y=x;
 //fac compresia
 while(tata[y])
  {
  t=tata[y];
  tata[y]=r;
  y=t;
  }
 return r;
 }
void join(int i, int j)
 {
 if(h[i] > h[j]) tata[j]=i;
 else tata[i]=j;
 if(h[i] == h[j]) h[j]++;
 }
int main()
 {
 int n,m,cod,x,y;
 fscanf(f,"%d%d",&n,&m);
 int i;
 for(i=1;i<=n;++i)
  {
  tata[i]=0;
  h[i]=1;
  }
 while(m--)
  {
   fscanf(f,"%d %d %d",&cod,&x,&y);
   if(cod==1) join(find(x), find(y));
   else
    {
     if(find(x) == find(y)) fprintf(g,"DA\n");
     else fprintf(g,"NU\n");
    }
  }
 return 0;
 }