Cod sursa(job #1548950)

Utilizator Daniel3Leu Daniel Mihai Daniel3 Data 11 decembrie 2015 18:23:28
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <stdio.h>

#define NMAX 100020
using namespace std;

int TT[NMAX], RG[NMAX];

int Find(int x){
    int R=x;
    int y;
    while(TT[R]!=R){
        R=TT[R];
    }

    //Path compression

    while(TT[x]!=x){
        y=TT[x];
        TT[x]=R;
        x=y;
    }

    return R;
}

void Union(int a, int b){
    if(RG[a]>RG[b]){
        TT[b]=a;
    }
    else {
        TT[a]=b;
    }
    if(RG[a]==RG[b])
    {
        TT[a]=b;
        RG[a]++;
    }
}

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

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

    int i, x, y, cd;
    for(i=0;i<N;i++){
        TT[i]=i;
        RG[i]=1;
    }
    for(i=0;i<M;i++){
        scanf("%d %d %d", &cd, &x, &y);
        if (cd == 2){
            if (Find(x) == Find(y)) printf("DA\n");
                else printf("NU\n");
        }
            else
                {
                    if (Find(x) == Find(y))  {fprintf(stderr,"%d ", i);return 0;}
                    Union(Find(x), Find(y));
                }
    }
    return 0;
}