Cod sursa(job #708879)

Utilizator idomiralinIdomir Alin idomiralin Data 7 martie 2012 14:09:56
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
# include <cstdio>

using namespace std;

int Tata[100005], Rang[100005];
int find(int x)
{int R, y;
     
    for (R = x; Tata[R] != R; R = Tata[R]);

    while(x != Tata[x])
    {
            y = Tata[x];
            Tata[x] = R;
            x = y;
            }
   
   return R;         
}    
    
void unite(int x, int y)
{
     if (Rang[x] > Rang[y])
          Tata[y] = x;
     else Tata[x] = y;
     
     if (Rang[x] == Rang[y]) Rang[y]++;
          
}

int n, m, op, a, b, i;
int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    
    scanf("%d%d",&n,&m);
    for (i = 1; i <= n; i++)
    {
        Tata[i] = i;
        Rang[i] = 1;
        }
    
    for (i = 1; i <= m; i++)
    {
        scanf("%d%d%d",&op,&a,&b);
        if (op == 2)
        {
               if (find(a) == find(b)) printf("DA\n");
                                else printf("NU\n");
               }
        else unite(find(a),find(b));
        }
    
return 0;
}