Cod sursa(job #633129)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 12 noiembrie 2011 23:34:15
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include<cstdio>
#include<vector>
using namespace std;

vector <int> tata, rang;

int Find(int x){
	if (tata[x] == x) return x;
		else{
			tata[x] = Find(tata[x]);
			return tata[x];
		}
}

void Merge (int &x, int &y){
	int xRoot = Find(x), yRoot = Find(y);
	if (xRoot == yRoot) return;
	
	(rang[xRoot] >= rang[yRoot]) ? tata[yRoot] = xRoot : tata[xRoot] = yRoot;
	if (rang[xRoot] = rang[yRoot]) rang[xRoot]++;
}

int main(){
	int n, m, i, tip, x, y;37.{
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);
 
	scanf("%d %d ", &n, &m);
	
	for (i = 0; i <= n; i++) tata.push_back(i);
	rang.assign(n+1, 1);
	
	for (i = 1; i <= m; i++){
		scanf("%d %d %d", &tip, &x, &y);
		if (tip == 1) Merge(x, y);
			else Find(y) == Find(x) ? printf(out, "DA\n") : printf(out, "NU\n");
	}
	
	return 0;
}