Cod sursa(job #529764)

Utilizator icepowdahTudor Didilescu icepowdah Data 5 februarie 2011 22:45:09
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <fstream>
using namespace std;

#define NMAX 100000
struct elem { int id, rank, parent; };

ifstream f("disjoint.in"); ofstream g("disjoint.out");
elem sets[NMAX];

int set_find(int x) {
	if (x==sets[x].parent) return x;
	int r = set_find(sets[x].parent);
	sets[x].parent = r;
	return r;
}

void set_union(int x, int y) {
	int r1 = set_find(x);
	int r2 = set_find(y);
	if (sets[r1].rank < sets[r2].rank) {
		sets[r1].parent = r2;
	}
	else {
		sets[r2].parent = r1;
		if (sets[r1].rank == sets[r2].rank) {
			sets[r1].rank++;
		}
	}
}

int main() {
	int N, M, cod, x, y;
	f>>N>>M;
	for (int i=1;i<=N;i++) {
		sets[i].id = sets[i].parent = i;
		sets[i].rank = 0;
	}
	for (int i=1;i<=M;i++) {
		f>>cod>>x>>y;
		if (cod == 1) {
			set_union(x,y);
		}
		else {
			if (set_find(x) == set_find(y)) {
				g<<"DA\n";
			}
			else g<<"NU\n";
		}
	}
	f.close(); g.close(); return 0;
}