Cod sursa(job #701987)

Utilizator soriynSorin Rita soriyn Data 1 martie 2012 18:52:17
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.68 kb
#include<fstream>
#define maxn 100010

using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
int RG[maxn],TT[maxn];
int n,m;
int find(int x)
{
	int R,y;
	for(R=x;R!=TT[R];R=TT[R]);
	
	for(;x!=TT[x];)
	{
		y=TT[x];
		TT[x]=R;
		x=y;
	}
	return R;
}

void unite(int x,int y)
{
	if(RG[x]>RG[y])
		TT[y]=x;
	else TT[x]=y;
	
	if(RG[x]==RG[y]) RG[y]++;
}

int main()
{
	in>>n>>m;
	for(int i=1;i<=n;i++)
	   TT[i]=i,RG[i]=1;
	for(int i=1;i<=m;i++)
	{
		int x,y,op;
		in>>op>>x>>y;
		if(op==1){
		if(find(x)!=find(y)) unite(find(x),find(y)); }
		else if(op==2)
		{
			if(find(x)==find(y)) out<<"DA\n";
			else out<<"NU\n";
		}
	}
}