Pagini recente » Cod sursa (job #1458963) | Cod sursa (job #2702450) | Cod sursa (job #496856) | Cod sursa (job #1761255) | Cod sursa (job #489399)
Cod sursa(job #489399)
#include<stdio.h>
#include<stdlib.h>
int find(int x,int *m){
if(m[x] == x)
return x;
else
m[x] = find(m[x],m);
return m[x];
}
void unite(int x1,int x2,int *m,int *r){
int x1r = find(x1,m);
int x2r = find(x2,m);
if(r[x1r] > r[x2r])
m[x2r] = x1r;
else if(r[x1r] < r[x2r])
m[x1r] = x2r;
else if(x1r != x2r){
m[x2r] = x1r;
r[x1r] = r[x1r] + 1;
}
}
int main(){
FILE *f,*g;
f = fopen("disjoint.in","r");
g = fopen("disjoint.out","w");
int n,m,i,x1,x2,c,k1,k2;
fscanf(f,"%d%d",&n,&m);
int *l = (int*)malloc((n + 1) * sizeof(int));
int *r = (int*)malloc((n + 1) * sizeof(int));
for(i = 1;i <= n;i++){
l[i] = i;
r[i] = 1;
}
for(i = 0;i < m;i++){
fscanf(f,"%d%d%d",&c,&x1,&x2);
if(c == 1)
unite(x1,x2,l,r);
else{
k1 = find(x1,l);
k2 = find(x2,l);
if(k1 == k2)
fprintf(g,"DA\n");
else
fprintf(g,"NU\n");
}
}
free(l);
free(r);
fclose(f);
fclose(g);
return 0;
}