Cod sursa(job #2852403)

Utilizator szaszdavidSzasz David szaszdavid Data 19 februarie 2022 12:46:38
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#define NMax 100005
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int N,M;
int R[NMax], Depth[NMax];

void init(){
    for(int i = 1; i <= N; i++)
        R[i] = i, Depth[i] = 1;
}

int findTrueRepr(int x){
    int init = x;

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

    x=R[x];
    while(R[init] != x){
        int next = R[init];
        R[init] = x;
        init = next;
    }

    return x;
}

bool areFromTheSameSet(int x, int y){
    return findTrueRepr(x) == findTrueRepr(y);
}

void unite(int x, int y){
    int rx = findTrueRepr(x);
    int ry = findTrueRepr(y);
    if(rx == ry)
        return;
    if(Depth[rx] > Depth[ry])
        R[ry] = rx;
    if(Depth[rx] < Depth[ry])
        R[rx] = ry;
    if(Depth[rx] == Depth[ry]){
        R[rx] = ry;
        Depth[ry] += 1;
    }
}


int main()
{
    int a,b,c,i;
    fin>>N>>M;
    init();
    for(i=1;i<=M;i++)
    {
        fin>>a>>b>>c;
        if(a==1)
            unite(b,c);
        else
        {
            if(findTrueRepr(b)==findTrueRepr(c))
                fout<<"DA"<<"\n";
            else
                fout<<"NU"<<"\n";
        }
    }
    return 0;
}