Cod sursa(job #1879754)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 15 februarie 2017 09:52:18
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include <bits/stdc++.h>
using namespace std;

constexpr int maxn = 1e5 + 10;
int tata[maxn] = {}, rk[maxn] = {};

int find_set(const int x){
    return tata[x] ? (tata[x] = find_set(tata[x])) : x; }

void merge_set(int x, int y){
    x = find_set(x), y = find_set(y);
    if(x == y) return;
    if(rk[x] < rk[y]) swap(x, y);
    if(rk[x] == rk[y]) ++rk[x];
    tata[y] = x; }

bool together(int x, int y){
    return find_set(x) == find_set(y); }

int main() {
    ifstream f("disjoint.in");
    ofstream g("disjoint.out");
    int n, m;
    f >> n >> m;

    for(int i = 0, t, x, y; i < m; ++i){
        f >> t >> x >> y;
        if(t == 1) merge_set(x, y);
        else       g << (together(x, y) ? "DA" : "NU") << '\n'; }
    return 0; }