Cod sursa(job #3170278)

Utilizator Radu_MocanasuMocanasu Radu Radu_Mocanasu Data 17 noiembrie 2023 10:34:57
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>
#define NMAX 100005
#define INFILE "disjoint.in"
#define OUTFILE "disjoint.out"

using namespace std;
ifstream fin(INFILE);
ofstream fout(OUTFILE);
int t[NMAX];
int h[NMAX];

int findr(int x){
    int r = x;
    while(r != t[r]) r = t[r];
    int y = x;
    t[x] = r;
    while(y != r){
        int d = t[y];
        t[y] = r;
        y = d;
    }
    return r;
}
void unire(int x, int y){
    int rx = findr(x);
    int ry = findr(y);
    if(h[rx] < h[ry]) t[x] = y;
    else{
        if(h[rx] > h[ry]) t[y] = x;
        else{
            t[rx] = ry;
            h[ry]++;
        }
    }
}
int main()
{
    int n,m,C,x,y;
    fin >> n >> m;
    for(int i = 1; i <= n; i++) t[i] = i;
    for(int i = 1; i <= m; i++){
        fin >> C >> x >> y;
        if(C == 1) unire(x,y);
        else{
            if(findr(x) == findr(y)) fout << "DA\n";
            else fout << "NU\n";
        }
    }
    return 0;
}