Cod sursa(job #565757)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 28 martie 2011 11:39:14
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <stdio.h>
const long NMAX=100010;

long n, m, p[NMAX], h[NMAX], x, y, t;

void makeSet(int u);
int findSet(int u);
void setUnion(int u, int v);

int main()
{
	long i, j, temp;
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);
	scanf("%ld%ld", &n, &m);
	for (i=1; i<=n; i++)
	  makeSet(i);	 
	for (i=0; i<m; i++)
	{
	  scanf("%ld%ld%ld", &t, &x, &y);
      if (t==1)
        setUnion(x, y);
      if (t==2)
        if (findSet(x)==findSet(y))
          printf("DA\n");
        else
          printf("NU\n");
    }//for i 
	return 0;
}//main

void makeSet(int u)
{
     p[u]=0;
     h[u]=0;
}//makeSet

int findSet(int u)
{
    if(p[u]==0)
      return u;
    p[u]=findSet(p[u]);
    return p[u];
}//findSet

void setUnion(int u, int v)
{
     u=findSet(u);
     v=findSet(v);
     if (h[u]>h[v])
       p[v]=u;
     else
     {
         p[u]=v;
         if (h[u]==h[v])
           h[v]++;
     }//else
}//setUnion