Cod sursa(job #529766)

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

#define NMAX 100000
ifstream f("disjoint.in"); ofstream g("disjoint.out");
pair<int,int> sets[NMAX];

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

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

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