Cod sursa(job #1451463)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 17 iunie 2015 10:17:02
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 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);

          switch (Op)
          {
              case 1:Union(X,Y);break;
              case 2:if (Find(X) == Find(Y)) printf("DA\n");
                                        else printf("NU\n");
                      break;
          }
      }
    return 0;
}