Cod sursa(job #3260410)

Utilizator ShAwDoRneYNacu Gabriel ShAwDoRneY Data 2 decembrie 2024 11:27:28
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

int getRep(int a, vector<int> &parent) {

    if(parent[a] == 0)
        return a;
    
    return parent[a] = getRep(parent[a], parent);
}

void combine(int a, int b, vector<int> &size, vector<int> &parent) {
    if(a == b)
        return ;
    
    if(size[a] >= size[b]) {
        parent[b] = a;
        size[a] += size[b];
    }
    else {
        parent[a] = b;
        size[b] += size[a];
    }
}

int main() {

    int noNodes, noEdges;
    fin >> noNodes >> noEdges;
    vector<int> parent(noNodes+1, 0);
    vector<int> psize(noNodes+1, 1);

    for(int i=1; i<=noEdges; i++) {
        int query, firstNode, secondNode;
        fin >> query >> firstNode >> secondNode;
        
        int rep1 = getRep(firstNode, parent);
        int rep2 = getRep(secondNode, parent);

        if(query == 1) {
            combine(rep1, rep2, psize, parent);
        }
        else {
            if(rep1 == rep2)
                fout << "DA" << '\n';
            else
                fout << "NU" << '\n';
        }

    }

    return 0;
}