Cod sursa(job #256085)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 11 februarie 2009 01:42:50
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include<stdio.h>
FILE*fin=fopen("disjoint.in","r");
FILE*fout=fopen("disjoint.out","w");
#define nm 100005
int n,tata[nm],grad[nm],m;
int find(int x)
{
    int ans,y=x;
    while(tata[x]!=x) x=tata[x];
    ans=x;
    while(tata[y]!=y)
    {
      x=tata[y];
      tata[y]=ans;
      y=x;
    }
    return ans;
}
void u(int x,int y)
{
   if(grad[x]>grad[y]) tata[y]=x;                 
   else tata[x]=y;
   if(grad[x]==grad[y]) grad[y]++;
}
int main()
{
   int i,cod,x,y;
   fscanf(fin,"%d%d",&n,&m);
   for(i=1;i<=n;i++) tata[i]=i,grad[i]=1;
   for(i=1;i<=m;i++)
   {
     fscanf(fin,"%d%d%d",&cod,&x,&y);
     if(cod==1) u(find(x),find(y));
     else if(find(x)==find(y)) fprintf(fout,"DA\n");
          else fprintf(fout,"NU\n");
   }  
   fclose(fin);
   fclose(fout);
   return 0;
}