Cod sursa(job #630344)

Utilizator mihaidutescuDutescu Mihai mihaidutescu Data 5 noiembrie 2011 12:29:38
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <stdio.h>

#define NMAX 100020

int tt[NMAX],rg[NMAX];
int n,m;

int find(int x)
{
	int tata,tmp;
	for(tata=x;tt[tata]!=tata;tata=tt[tata]);
	
	while(tt[x]!=tata)
	{
		tmp=tt[x];
		tt[x]=tata;
		x=tmp;
	}
	return tata;
}

void join(int x,int y)
{
	int ttx=find(x),tty=find(y);
	if(rg[ttx]<rg[tty])
		tt[ttx]=tt[tty];
	else if(rg[ttx]>rg[tty])
		tt[tty]=tt[ttx];
	else
	{
		tt[ttx]=tt[y];
		rg[tty]++;
	}
}

int main()
{
	FILE *f=fopen("disjoint.in","r"),*g=fopen("disjoint.out","w");
	fscanf(f,"%d %d\n",&n,&m);
	int i,x,y,codop;
	for(i=1;i<=n;i++)
	{
		tt[i]=i;
		rg[i]=0;
	}
	for(i=1;i<=m;i++)
	{
		fscanf(f,"%d %d %d\n",&codop,&x,&y);
		if(codop==1)
			join(x,y);
		else
			if(find(x)==find(y))
				fprintf(g,"DA\n");
			else
				fprintf(g,"NU\n");
	}
	return 0;
}