Cod sursa(job #489399)

Utilizator edward_alexStanciu Alexandru Marian edward_alex Data 2 octombrie 2010 14:54:04
Problema Paduri de multimi disjuncte Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.98 kb
#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;
}