Cod sursa(job #2808353)

Utilizator FraNNNkieFrancesco-Gregorio Petrovici FraNNNkie Data 24 noiembrie 2021 22:20:56
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <vector>
#include <iostream>

#define Nmax 100005
using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");
int parent[Nmax];

int findParent(int i){
    int root = i;
    //mergem pe vectorul de tati spre radacina
    while(parent[root] != root){
        root = parent[root];
    }
    //path compression
    while(i != root){
        int next = parent[i];
        parent[i] = root;
        i = next;
    }
    return root;
}

void unify (int x, int y){
    int px = findParent(x);
    int py = findParent(y);
    parent[px] = py;
}

int main()
{
    int n, m, question, a, b;
    f >> n >> m;
    for(int i = 0; i < n; ++i){
        parent[i] = i;
    }
    for(int i = 0; i < m; ++i){
        f >> question >> a >> b;
        if(question == 1){
            unify(a, b);
        }
        else if(question == 2){
            if(findParent(a) != findParent(b)){
                cout << "NU\n";
            }
            else{
                cout << "DA\n";
            }
        }
    }
    f.close();
    g.close();
    return 0;
}