Cod sursa(job #234470)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 20 decembrie 2008 23:22:24
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.73 kb
#include<stdio.h>
FILE*fin=fopen("disjoint.in","r");
FILE*fout=fopen("disjoint.out","w");
#define maxn 100001
int n,m;
int t[maxn],ad[maxn];
int find(int x)
{
  int y=x,z;
  while(t[y]) y=t[y];
  while(t[x])
  {
    z=t[x];
    t[x]=y;
    x=z;
  }
  t[y]=0;
  return y;
}
void unite(int x,int y)
{
  if(ad[x]>ad[y]) t[y]=x;
  else t[x]=y;
  if(ad[x]==ad[y]) ad[y]++;
}
int main()
{
  int i;
  int op,x,y;
  fscanf(fin,"%d%d",&n,&m);
  for(i=1;i<=n;i++)
  {
    t[i]=0;
    ad[i]=0;
  }
  for(i=1;i<=m;i++)
  {
    fscanf(fin,"%d%d%d",&op,&x,&y);
    if(op==2)
    {
      if(find(x)==find(y)) fprintf(fout,"DA\n");
      else fprintf(fout,"NU\n");
    }
    else unite(find(x),find(y));
  }
  return 0;
}