Cod sursa(job #705396)

Utilizator DSzprogDombi Szabolcs DSzprog Data 4 martie 2012 10:58:42
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <cstring>
#include <cstdio>
#include <cmath>

int n, m;
int dis[100008];
int wgt[100008];

int fall(int f) {
	while (dis[f] != f) {
		dis[f] = dis[dis[f]];
		f = dis[f];
	}
	return(f);
}

int connect(int a, int b) {
	a = fall(a);
	b = fall(b);
	if (a != b) {
		if (wgt[a] < wgt[b]) {
			wgt[a] += wgt[b];
			dis[b] = a;
		} else {
			wgt[b] += wgt[a];
			dis[a] = b;
		}
	}
}

bool connected(int a, int b) {
	a = fall(a);
	b = fall(b);
	return(a == b);
}

int main() {
	FILE * in = fopen("disjoint.in", "rt");
	FILE * out = fopen("disjoint.out", "wt");

	fscanf(in, "%d%d", &n, &m);
	for (int i = 0; i < n; ++i) {
		dis[i] = i;
	}
	while (m--) {
		int x, y, z;
		fscanf(in, "%d%d%d", &x, &y, &z);
		if (x == 2) {
			if (connected(y, z)) {
				fputs("DA\n", out);
			} else {
				fputs("NU\n", out);
			}
		} else {
			connect(y, z);
		}
	}

	fclose(in);
	fclose(out);
}