Cod sursa(job #255748)

Utilizator scvalexAlexandru Scvortov scvalex Data 10 februarie 2009 16:02:32
Problema Paduri de multimi disjuncte Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.7 kb
#include <stdio.h>

int N;
int T[100001], R[100001];

int find_progenitor(int a) {
	int r, ba = a, aux;
	for (r = 0; T[a]; ++r, a = T[a])
		;
	for (; T[ba]; ba = aux) {
		aux = T[ba];
		T[ba] = a;
	}
	R[a] = r;
	return a;
}

int main(int argc, char *argv[]) {
	int a, b, op, ta, tb, M;

	FILE *fi = fopen("disjoint.in", "r");
	fscanf(fi, "%d %d", &N, &M);
	FILE *fo = fopen("disjoint.out", "w");
	while (M--) {
		fscanf(fi, "%d %d %d", &op, &a, &b);
		ta = find_progenitor(a);
		tb = find_progenitor(b);
		if (op == 1) {
			if (R[ta] > R[tb])
				T[tb] = ta;	
			else
				T[ta] = tb;
		} else {
			if (ta == tb)
				fprintf(fo, "DA\n");
			else
				fprintf(fo, "NU\n");
		}
	}
	fclose(fo);
	fclose(fi);

	return 0;
}