Cod sursa(job #1158714)

Utilizator shervladVlad Seremet shervlad Data 29 martie 2014 00:18:45
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");

void initialize(int n, int* parinte, int* r)
{
	for(int i=1;i<=n;i++)
	{
		parinte[i]=i;
		r[i]=0;
	}
}

int f(int x,int* parinte)
{
	if(parinte[x]!=x)
	{
		parinte[x]=f(parinte[x],parinte);
	}

		return parinte[x];
}
void link(int x,int y, int* parinte,int* r)
{

	if(r[x]<=r[y])
		{
			parinte[x]=y;
			if(r[x]==r[y])
				r[x]++;

		}
	else
	{
		parinte[y]=x;
	}

}
void unite(int x,int y,int* parinte,int* r)
{
	int i=f(x,parinte),j=f(y,parinte);
	if(i!=j)
	link(i,j,parinte,r);
}

int main()
{
	int n,m;
	in>>n>>m;
	int parinte[n+6];
	int r[n+6];
	initialize(n+6,parinte,r);

	int op,j,k;
	for(int i=1;i<=m;i++)
	{
		in>>op>>j>>k;
		if(op==1)
		{
			unite(j,k,parinte,r);
		}
		if(op==2)
		{
			if(f(j,parinte)==k)
				out<<"DA"<<endl;
			else
				out<<"NU"<<endl;
		}

	}
return 0;

}