Cod sursa(job #780761)

Utilizator visanrVisan Radu visanr Data 21 august 2012 11:54:09
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <cstdio>
#include <cstdlib>
using namespace std;


#define nmax 100010
int Father[nmax], Rank[nmax], N, M, X, Y, C;


int Find(int X)
{
    if(X != Father[X]) X = Find(Father[X]);
    return X;
}


void Merge(int X, int Y)
{
     if(Rank[X] > Rank[Y]) Father[Y] = X;
     else Father[X] = Y;
     if(Rank[X] == Rank[Y]) Rank[Y] ++;
}

int main()
{
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    int i;
    scanf("%i %i", &N, &M);
    for(i = 1; i <= N; i++) Father[i] = i, Rank[i] = 1;
    for(i = 1; i <= M; i++)
    {
          scanf("%i %i %i", &C, &X, &Y);
          if(C == 1) Merge(Find(X), Find(Y));
          else if(Find(X) == Find(Y)) printf("DA\n"); else printf("NU\n");
    }
    return 0;
}