Cod sursa(job #1212608)

Utilizator vasile_pojogaPojoga Vasile vasile_pojoga Data 25 iulie 2014 13:06:28
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>

using namespace std;

void solve();
void makeSet(int node);
int find(int node);
void join(int x, int y);

struct node
{
	int parent;
	int rank;
};

int N;
struct node set[100005];

int main()
{
	solve();
	return 0;
}

void solve()
{
	ifstream fin("disjoint.in");
	ofstream fout("disjoint.out");
	int m,o,x,y;
	fin>>N>>m;
	for(int i=1;i<=N;i++)
	{
		makeSet(i);
	}
	for(int i=0;i<m;i++)
	{
		fin>>o>>x>>y;
		if(o == 1)
		{
			join(x,y);
		}
		else
		{
			fout<<(find(x) == find(y) ? "DA\n" : "NU\n");
		}
	}
}

void makeSet(int node)
{
	set[node].parent = node;
	set[node].rank = 0;
}

int find(int node)
{
	if(set[node].parent == node)
	{
		return node;
	}
	else
	{
		set[node].parent = find(set[node].parent);
		return set[node].parent;
	}
}

void join(int x, int y)
{
	int rootX = find(x);
	int rootY = find(y);
	if(rootX == rootY)
	{
		return;
	}
	if(set[rootX].rank < set[rootY].rank)
	{
		set[rootX].parent = rootY;
	}
	else if(set[rootX].rank > set[rootY].rank)
	{
		set[rootY].parent = rootX;
	}
	else
	{
		set[rootX].parent = rootY;
		set[rootY].rank += 1;
	}
}