Cod sursa(job #505876)

Utilizator acelasi7Tudor Maxim acelasi7 Data 4 decembrie 2010 12:12:56
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include<stdio.h>
using namespace std;
#define nrd 100001
FILE *in=fopen("disjoint.in","r"),*out=fopen("disjoint.out","w");
int tata[nrd],cap[nrd],n,m;
int ctat(int x)
{
	int aux;
	aux=x;
	while(tata[x]!=x)
		x=tata[x];
	tata[aux]=x;
	return x;
}
void unire(int x,int y)
{
	x=ctat(x);
	y=ctat(y);
	if(cap[x]>cap[y])
	{
		tata[y]=x;
		cap[x]+=cap[y];
	}
	else{ tata[x]=y; cap[y]+=cap[x];}
}
int main()
{
	int i,x,y,c;
	fscanf(in,"%d %d",&n,&m);
	for(i=1;i<=n;i++)
	{
		tata[i]=i;
		cap[i]=1;
	}
	for(i=1;i<=m;i++)
	{
		fscanf(in,"%d %d %d",&c,&x,&y);
		switch(c)
		{
		case(1):unire(x,y);break;
		case(2):{
			if(ctat(x)==ctat(y))fprintf(out,"DA\n");
			else fprintf(out,"NU\n");
			break;
			};
		}
	}
	return 0;
}