Cod sursa(job #1390940)

Utilizator popfiPopescu Filip popfi Data 17 martie 2015 14:23:42
Problema Paduri de multimi disjuncte Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 0.79 kb
#include <stdio.h>
#include <stdlib.h>

int sef[100000];

int find(int i){
  while(sef[i]!=i)
    i=sef[i];
  return i;
}

inline int min(int a, int b){
  if(a<b)
    return a;
  return b;
}

inline int max(int a, int b){
  if(a>b)
    return a;
  return b;
}

int main()
{
  int n, m, j, x, y, a, b, i, c;
  FILE *fi=fopen("disjoint.in","r"), *fo=fopen("disjoint.out", "w");
  fscanf(fi, "%d%d", &n, &m);
  for(i=1;i<=n;i++)
    sef[i]=i;
  for(j=0;j<m;j++){
    fscanf(fi, "%d%d%d", &c, &x, &y);
    if(c==1){
      a=find(x);
      b=find(y);
      if(a!=b)
        sef[min(a,b)]=max(a,b);
    }
    if(c==2){
      if(find(x)==find(y))
        fprintf(fo, "DA\n");
      else
        fprintf(fo, "NU\n");
    }
  }
  fclose(fi);
  fclose(fo);
  return 0;
}