Cod sursa(job #266595)

Utilizator drag0shSandulescu Dragos drag0sh Data 25 februarie 2009 20:53:10
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.7 kb
#include <stdio.h>

#define nmax 100020
#define in "disjoint.in"
#define out "disjoint.out"

FILE *f=fopen(in,"r"),*g=fopen(out,"w");
int n,m,tt[nmax],rg[nmax];

int find(int x){
  int r,y;
  for(r=x;tt[r]!=r;r=tt[r]);
  while(tt[x]!=x){
    y=tt[x];
    tt[x]=r;
    x=y;
  }
  return r;
}

void unite(int x,int y){
  if(rg[x]>rg[y])tt[y]=x;
  else  tt[x]=y;
  if(rg[x]==rg[y])rg[y]++;
}

int main(){
  fscanf(f,"%d%d",&n,&m);
  
  int x,y,i,cd;
  for(i=1;i<=n;i++){
    tt[i]=i;
    rg[i]=1;
  }
  for(i=1;i<=m;i++){
    fscanf(f,"%d%d%d",&cd,&x,&y);
    if(cd==2){
      if(find(x)==find(y))fprintf(g,"DA\n");
      else fprintf(g,"NU\n");
    }
    else{
      unite(find(x),find(y));
    }
  }
  return 0;
  
}