Cod sursa(job #1824287)

Utilizator aaether14Dinescu Stefan Cristian aaether14 Data 7 decembrie 2016 17:32:27
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <stdint.h>



struct node
{

	node * parent;
	int32_t rank;

};



void init_node(node * n)
{
	n->parent = n;
	n->rank = 0;
}


node * find_parent(node * n)
{

	if (n != n->parent)
		n->parent = find_parent(n->parent);
	return n->parent;
}


 void unite(node * n1, node * n2)
 {
 	 node * n1_parent = find_parent(n1);
 	 node * n2_parent = find_parent(n2);
 	 if (n1_parent->rank > n2_parent->rank)
 	 	n2_parent->parent = n1_parent;
 	 else if (n1_parent->rank < n2_parent->rank)
 	 	n1_parent->parent = n2_parent;
 	 else
 	 {
 	 	n1_parent->parent = n2_parent;
 	 	++n2_parent->rank;
 	 } 
 }



int main()
{
	std::ifstream fin("disjoint.in");
	std::ofstream fout("disjoint.out");


	int32_t n, m, op_code, x, y;
	fin>>n>>m;



	node * nodes = new node[n];
	for (int i = 0; i < n; ++i)
		init_node(nodes + i);



	for (int i = 0; i < m; ++i)
	{
		fin>>op_code>>x>>y;
		if (op_code == 1)
			unite(nodes+x-1, nodes+y-1);
		else if (op_code == 2)
			if (find_parent(nodes+x-1) == find_parent(nodes+y-1))
				fout << "DA\n";
			else
				fout << "NU\n";

	}

	delete [] nodes;
	fout.close();
	fin.close();
	return 0;
}