Cod sursa(job #1766275)

Utilizator dodecagondode cagon dodecagon Data 27 septembrie 2016 19:47:32
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <stdio.h>

int parent[100009],rang[100009],k,i,n,m,x,y;

int find(int x)
{
	int r=x;
	while (r!=parent[r])
		r=parent[r];
	while (x!=parent[x])
	{
		k=parent[x];
		parent[x]=r;
		x=k;
	}
  return r;
}

void _union(int x,int y)
{
	x=find(x);
	y=find(y);
	if (x!=y)
	{
		if (rang[x]<rang[y])
		   parent[x]=y; else 
		   parent[y]=x;
		 if (rang[x]==rang[y])
		    rang[x]++;  
	}
}

int main(int argc, char const *argv[])
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
   
     scanf("%d%d",&n,&m);

     for (i=1;i<=n;i++)
       parent[i]=i;

     while (m--)
     {
        scanf("%d%d%d",&k,&x,&y);
        if (k==1)
        	_union(x,y); else 
         {
         	if (find(x)==find(y))
         		puts("DA"); else 
         	    puts("NU");
         }
     }

	fclose(stdin);
	fclose(stdout);
	return 0;
}