Cod sursa(job #1667251)

Utilizator TincaMateiTinca Matei TincaMatei Data 28 martie 2016 19:50:49
Problema Paduri de multimi disjuncte Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.03 kb
#include <stdio.h>

int sef[100000];

int find(int x){
  if(x==sef[x])//am gasit seful suprem
    return x;
  else{//nu am gasit seful suprem,mergem la urmatorul
    sef[x]=find(sef[x]);//toti sefii prin care trecem vor avea ca sef seful suprem
    //pe scurt compresia caii
    return find(sef[x]);
  }
}

void unire(int x,int y){//l-as fi denumit union() dar nu am voie :(
  sef[find(y)]=sef[find(x)];
}//reunim elementele

int main(){
  int n,m,i,cod,x,y;
  FILE *fin=fopen("disjoint.in","r");
  FILE *fout=fopen("disjoint.out","w");
  fscanf(fin,"%d%d",&n,&m);
  for(i=0;i<n;i++)//initial,fiecare element este propiul sau sef
    sef[i]=i;//toate multimile au un singur element
  for(i=0;i<m;i++){
    fscanf(fin,"%d%d%d",&cod,&x,&y);
    x--;//adaptam x si y;noi lucram cu nr de la 0 la n-1
    y--;
    if(cod==1)//reunim multimile
      unire(x,y);
    else if(find(x)==find(y))//vedem daca elementele fac parte din aceeasi multime
      fprintf(fout,"DA\n");
    else
      fprintf(fout,"NU\n");
  }
  fclose(fin);
  fclose(fout);
  return 0;
}