Cod sursa(job #2922057)

Utilizator tzancauraganuTzanca Uraganu tzancauraganu Data 3 septembrie 2022 14:16:01
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <cassert>
#include <cstring>
#include <set>
#include <unordered_map>
#include <memory>
#include <deque>
#include <queue>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <sstream>
#include <bitset>
 
using namespace std;
 
 
ifstream f("disjoint.in");
ofstream g("disjoint.out");

void compress(int n, int p, vector<int>& parent) {
    for (; n != p; ) {
        int f = parent[n];
        parent[n] = p;
        n = f;
    }
}

int getset(int n, vector<int>& parent) {
    int p = n;

    while (parent[p] != p)
        p = parent[p];

    return p;
}

bool unite(int a, int b, vector<int>& parent, vector<int>& height) {
    int pa = getset(a, parent);
    int pb = getset(b, parent);

    if (pa == pb) {
        compress(a, pa, parent);
        compress(b, pb, parent);
        return false;
    }

    if (height[pa] > height[pb]) {
        swap(pa, pb);
        swap(a, b);
    }

    parent[pa] = pb;
    ++height[pb];
    compress(a, pb, parent);
    compress(b, pb, parent);

    return true;
}
 
int main() {
    int N, M;
    f >> N >> M;

    vector<int> parent(N), height(N);
    for (int i = 0; i < N; i++) {
        parent[i] = i;
        height[i] = 1;
    }

    for (int i = 0; i < M; i++) {
        int op, a, b;
        f >> op >> a >> b;
        --a;
        --b;

        if (op == 1) {
            assert(unite(a, b, parent, height));
        } else {
            int pa = getset(a, parent);
            int pb = getset(b, parent);
            compress(a, pa, parent);
            compress(b, pb, parent);
            g << (pa == pb ? "DA" : "NU") << '\n';
        }
    }
    
 
    f.close();
    g.close();
    return 0;
}