Cod sursa(job #1704921)

Utilizator perjulucianPerju Lucian Ionut perjulucian Data 19 mai 2016 16:32:02
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <iostream>
#include <fstream>
#include <vector>

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

int N, M;

int parent[100001];
int rank[100001];

/*UnionFind(int size) {
	parent = new int[size];
	rank = new int[size];
	for(int i = 0 ; i < size ; ++i){
		parent[i] = i; //just create independent subsets
		rank[i] = 0;
	}
}*/

int find(int x){
	if(parent[x] != x){
		parent[x] = find(parent[x]);
	}
	return parent[x];
}

void Union(int x,int y){
	int xRoot = find(x);
	int yRoot = find(y);
	if(xRoot == yRoot){
		return;
	}
	//
	
	if(rank[xRoot] < rank[yRoot]){
		parent[xRoot] = yRoot;
	}else if(rank[xRoot] > rank[yRoot]){
		parent[yRoot] = xRoot;
	}else{
		parent[yRoot] = xRoot;
		rank[xRoot] += 1;
	}
}


	
	

int main(){
	f >> N >> M;
	for(int i = 1 ; i <= N ; ++i){
		parent[i] = i;
	}
	int c, x, y;

	for(int i = 0 ; i < M ; ++i){
		f >> c >> x >> y ;
		if(c == 1){
			Union(x,y);
			continue;
		}
		//else if(c == 2)
		if(find(x) == find(y)){
			g << "DA\n";
		}else{
			g << "NU\n";
		}

	}


	return 0 ;
}