Cod sursa(job #1222342)

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

using namespace std;

struct TreeNode{
	int val;
	struct TreeNode *parent;
	struct 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 struct TreeNode(a));
}

int find(int a){
	struct 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);
	struct TreeNode *ppa = trees.at(pa);
	struct 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");
		}
	}
}