Cod sursa(job #1451476)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 17 iunie 2015 10:40:53
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 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(A,B);
          }
        else
          {
              if (A == B)
                      printf("DA\n");
              else
                      printf("NU\n");
          }
      }
    return 0;
}