Cod sursa(job #371708)

Utilizator allynaAlina S allyna Data 6 decembrie 2009 13:02:17
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<stdio.h>
#define NMAX 100005
using namespace std;
int n,m,tata[NMAX],ordin[NMAX],x,y,x1,y1;
void group(int x)
{
	tata[x]=x;
	ordin[x]=1;
}
int go(int x)
{
	if(tata[x]= x) 
		return x;
	else
	{
		tata[x]=go(tata[x]);
		return tata[x];
	}
}
void reuniune(int x,int y)
{
	x1=go(x);
	y1=go(y);
	if(ordin[x1]>ordin[y1])
		tata[y1]=x1;
	  else if(ordin[x1]<ordin[y1])
		  tata[x1]=y1;
	   else 
   if(x1!=y1)
		   {
		   tata[x1]=y1;
		   ordin[x1]++;
		   }
}
int main()
{
 	int i,t,in,sf;
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	 	group(i);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&t,&in,&sf);
		if(t==1)
			reuniune(in,sf);
		else 
		  {
			  if(go(in)==go(sf))
				  printf("DA\n");
			    else 
				printf("NU\n");
		  }
	}
	return 0;
}