Cod sursa(job #2267518)

Utilizator MoldooooooooMoldoveanu Stefan Moldoooooooo Data 23 octombrie 2018 18:47:59
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#define MaxN 100005
using namespace std;
int Head[MaxN], N, M, i, Size[MaxN];
void Join(int a, int b);
void Test(int a, int b);
int main()
{
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    scanf("%d%d", &N, &M);
    for(i=1; i<=N; ++i){Head[i]=-1; Size[i]=1;}
    for(i=1; i<=M; ++i){
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        if(x==1)Join(y, z);
        else Test(y, z);
    }
    return 0;
}
void Join(int a, int b){
    if(Head[a]==-1 && Head[b]==-1){
        Head[b]=a;
        Size[a]=2;
        }
    else{
        while(Head[a]!=-1)a=Head[a];
        while(Head[b]!=-1)b=Head[b];
        if(Size[a]<Size[b]){Head[a]=b; Size[b]+=Size[a];}
        else {Head[b]=a; Size[a]+=Size[b];}
    }
    return;
}
void Test(int a, int b){
    int List[MaxN], VfList=0, i;
    while(Head[a]!=-1){
        List[++VfList]=a;
        a=Head[a];
    }
    for(i=1; i<=VfList; ++i)Head[List[i]]=a;
    VfList=0;
    while(Head[b]!=-1){
        List[++VfList]=b;
        b=Head[b];
    }
    for(i=1; i<=VfList; ++i)Head[List[i]]=b;
    if(a==b)printf("DA\n");
    else printf("NU\n");
}