Pagini recente » Cod sursa (job #1511896) | Cod sursa (job #1755866) | Cod sursa (job #1497127) | Cod sursa (job #2876170) | Cod sursa (job #2238613)
#include<iostream>
#include<fstream>
using namespace std;
int find(int x, int arb[]){
int aux=x;
while(arb[x]!=x) x=arb[x];
//compresie
while(aux!=arb[aux]){
int tmp=arb[aux];
arb[aux]=x;
aux=tmp;
}
return x;
}
void unite(int x, int y, int arb[], int rng[]){
if(rng[x]<rng[y]) arb[x]=y;
else arb[y]=x;
if(rng[x]==rng[y]) rng[x]++;
}
int main(){
ifstream in("disjoint.in");
FILE *out=fopen("disjoint.out","w");
int i, n, m, op, x, y;
in>>n>>m;
int arb[n+2], rng[n+2];
for(i=1;i<=n;i++){
arb[i]=i;
rng[i]=1;
}
while(m--){
in>>op>>x>>y;
switch(op){
case 1: {
if(find(x,arb)!=find(y,arb)) unite(find(x,arb),find(y,arb), arb, rng);
break;
}
case 2:{
if(find(x,arb)==find(y,arb)) fprintf(out,"DA\n");
else fprintf(out,"NU\n");
break;
}
default: break;
}
}
in.close(); fclose(out);
return 0;
}