Cod sursa(job #1510748)

Utilizator ooptNemes Alin oopt Data 25 octombrie 2015 16:12:12
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <bits/stdc++.h>
#define NMax 100005
using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

int n;
int FA[NMax];
int GR[NMax];

int fatherOf(int x) {
	int el, aux;
	for (el=x; el!=FA[el]; el=FA[el]);
	for (;x != FA[x];) {
		aux = FA[x];
		FA[x] = el;
		x = aux;
	}
	
	return el;
}

int join(int x, int y) {
	int rx = fatherOf(x);
	int ry = fatherOf(y);
	
	if (GR[rx] > GR[ry]) {
		FA[ry] = rx;
	} else if (GR[rx] < GR[ry]) {
		FA[rx] = ry;
	} else {
		FA[rx] = ry;
		GR[ry]++;
	}
}

void init() {
	for (int i=1;i<=n;i++) {
		FA[i] = i;
		GR[i] = 1;
	}
}

void read() {
	int m;
	f>>n>>m;
	init();
	for (int i=1;i<=m;i++) {
		int tip, x, y;
		f>>tip>>x>>y;
		if (tip == 1) {
			join(x,y);
		} else if (tip == 2) {
			if (fatherOf(x) == fatherOf(y)) {
				g<<"DA\n";
			} else {
				g<<"NU\n";
			}
		}
	}
}

int main() {
	
	read();

	f.close(); g.close();
	return 0;
}