Pagini recente » Cod sursa (job #1109471) | Cod sursa (job #2208901) | Cod sursa (job #2357710) | Cod sursa (job #1735789) | Cod sursa (job #1667251)
#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;
}