Cod sursa(job #689991)

Utilizator gener.omerGener Omer gener.omer Data 25 februarie 2012 00:48:28
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <cstdio>
using namespace std;

#define NMAX 100005

int P[NMAX], rank[NMAX], N, M;

void make_set(int N){
	for(int i = 1; i <= N; ++i)
		P[i] = i, rank[i] = 1;
}

int find_set(int x){
	if(x != P[x])
		P[x] = find_set(P[x]);
	return P[x];
}

void link(int x, int y){
	if(rank[x] > rank[y]){
		P[y] = x;
	}
	else{
		P[x] = y;
		if(rank[x] == rank[y])
			++rank[y];
	}
}

void make_union(int x, int y){
	link(find_set(x), find_set(y));
}

int main(){
	FILE * f = fopen("disjoint.in", "rt");
	FILE * g = fopen("disjoint.out", "wt");
	fscanf(f, "%d %d", &N, &M); 
	make_set(N);
	for(int i = 0; i < M; ++i){
		int code, x, y;
		fscanf(f, "%d %d %d", &code, &x, &y);
		if(code == 1)
			make_union(x, y);
		else if(code == 2){
			if(find_set(x) == find_set(y))
				fprintf(g, "DA\n");
			else
				fprintf(g, "NU\n");
		}
	}
	fclose(f);
	fclose(g);
	return 0;
}