Cod sursa(job #1158712)

Utilizator shervladVlad Seremet shervlad Data 29 martie 2014 00:12:03
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 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);
	}
    if(parinte[x]==x)
		return 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)
{
	link(f(x,parinte),f(y,parinte),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;

}