Cod sursa(job #253580)

Utilizator yoyolichIoana Ardeleanu yoyolich Data 5 februarie 2009 23:27:59
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include<stdio.h>
FILE *f=fopen("disjoint.in","r"), *g=fopen("disjoint.out","w");
int n,m,cod,x,y,t[100001],h[100001],i;

inline int find(int x)
{
            int R,y;
			
			for(R=x; R!=t[R] ; R=t[R]);
			
			while(t[x]!=x)
			{
				y=t[x];
				t[x]=R;
				x=y;
			}
			
			
            return R;
}

void uneste(int i, int j)
{
			i=find(i);
            j=find(j);

            if(h[i] < h[j]) t[i]=j;
            else t[j]=i;

            if(h[i]==h[j]) ++h[i];

}

int main()
{
	fscanf(f,"%d %d",&n,&m);
	
	for(i=1;i<=n;i++)
	{
		h[i]=1;
		t[i]=i;
	}
	for(i=1;i<=m;i++)
	{
		fscanf(f,"%d %d %d",&cod,&x,&y);
		if(cod==1)
			uneste(x,y);
		else 
			if(find(x)==find(y)) fprintf(g,"DA\n");
				else fprintf(g,"NU\n");
	}
	
	fclose(f);
	fclose(g);
	return 0;
}