Cod sursa(job #833857)

Utilizator toranagahVlad Badelita toranagah Data 13 decembrie 2012 10:06:58
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdlib>

#include <fstream>
#include <iostream>
using namespace std;

const int MAX_N = 100100;

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

int father[MAX_N];
int N, M;

void build_sets();
void unite_sets(int node1, int node2);
bool query(int node1, int node2);
int find_root(int node);

int main() {
    fin >> N >> M;
    build_sets();
    for (int i = 1; i <= M; ++i) {
        int cod, x, y;
        fin >> cod >> x >> y;
        if (cod == 1) {
            unite_sets(x, y);
        } else if (query(x, y)) {
            fout << "DA" << '\n';
        } else {
            fout << "NU" << '\n';
        }
    }
    return 0;
}

void build_sets() {
    for (int i = 1; i <= N; ++i) {
        father[i] = i;
    }
}

void unite_sets(int node1, int node2) {
    int root1 = find_root(node1);
    int root2 = find_root(node2);
    if (root1 == root2) return;
    if (rand() & 1) {
        father[root1] = root2;
    } else {
        father[root2] = root1;
    }
}

int find_root(int node) {
    if (father[node] == node)
        return node;
    return (father[node] = find_root(father[node]));
}

inline bool query(int node1, int node2) {
    if (find_root(node1) == find_root(node2))
        return true;
    return false;
}