Cod sursa(job #3194166)

Utilizator tony_lolCristea Marc Antonio tony_lol Data 17 ianuarie 2024 10:36:09
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

const int NMAX = 100005;
int dad[NMAX], rang[NMAX];
int N, M;

void read(){
    f >> N >> M;
}

int Find(int nod){
    if(nod != dad[nod]){
        int repr = Find(dad[nod]);
        /// Compresia drumului
        dad[nod] = repr;
        return repr;
    }
    return nod;
}

void Union(int x, int y){
    if(rang[x] < rang[y]){
        dad[x] = y;
    }else if(rang[y] < rang[x]){
        dad[y] = x;
    }else{
        dad[x] = y;
        rang[y]++;
    }
}

int main()
{
    read();

    for(int i = 1; i <= N; i++){
        dad[i] = i;
    }

    for(int i = 1; i <= M; i++){
        int cod, x, y;
        f >> cod >> x >> y;

        int repr_x = Find(x);
        int repr_y = Find(y);

        if(cod == 1){
            Union(repr_x, repr_y);
        }else{
            if(repr_x == repr_y){
                g << "DA\n";
            }else{
                g << "NU\n";
            }
        }
    }
    return 0;
}