Cod sursa(job #1451467)

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

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