Cod sursa(job #1222345)

Utilizator roxana.istratePoenaru Roxana roxana.istrate Data 22 august 2014 22:18:00
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <stack>
#include <vector>
#include <utility>

using namespace std;

class TreeNode{
public:
	int val;
	TreeNode *parent;
	TreeNode(int v) : val(v), parent(NULL) {}

};

int n, m, op, a, b;
vector<struct TreeNode*> trees;
vector<int> ranks;

void make_set(int a){
	trees.push_back(new TreeNode(a));
}

int find(int a){
	TreeNode *t = trees.at(a);
	while(t->parent != NULL){
		t = t->parent;
	}
	return t->val;
}

void link(int a, int b){
	int pa = find(a);
	int pb = find(b);
	TreeNode *ppa = trees.at(pa);
	TreeNode *ppb = trees.at(pb);
	ppb->parent = ppa;
}

void uunion(int a, int b){
	if(ranks.at(a) > ranks.at(b)){
		link(a, b);
	}else{
		link(b, a);
		if(ranks.at(a) == ranks.at(b)){
			ranks.at(b)++;
		}
	}
}

int main(){
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for(int i = 0; i < n; i++){
		make_set(i);
		ranks.push_back(0);
	}
	for(int i = 0; i < m; i++){
		scanf("%d%d%d", &op, &a, &b);
		a--, b--;
		switch(op){
		case 1: 
			uunion(a, b);
			break;
		case 2: 
			(find(a) == find(b))? printf("DA\n") : printf("NU\n");
		}
	}
}