Cod sursa(job #1451469)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 17 iunie 2015 10:27:21
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
const int Dim = 100005;

int N,M,P[Dim],R[Dim];

int Find(int X)
{
    int Root,aux;

    for (Root = X;P[Root] != Root;Root = P[Root]);

    while (P[X] != X)
    {
        aux = P[X];
        P[X] = Root;
        X = aux;
    }
    return Root;
}

void Union(int X,int Y)
{
    if (R[X] > R[Y])
        P[Y] = X;
      else
        P[X] = Y;

    if (R[X] == R[Y]) R[Y]++;
}

int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);

     scanf("%d%d",&N,&M);

      for (int i = 1;i <= N;i++)
        P[i] = i,R[i] = 1;

    int Op,X,Y;

      for (int i = 1;i <= M;i++)
      {
          scanf("%d%d%d",&Op,&X,&Y);
          int A = Find(X),B = Find(Y);

          if (Op == 1)
          {
              if (A != B)
                      Union(X,Y);
          }
        else
        {
            if (A == B) printf("DA\n");
                             else printf("NU\n");
        }
      }
    return 0;
}