Cod sursa(job #1843678)

Utilizator adimAlexander Dmitriev adim Data 9 ianuarie 2017 01:21:17
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>

#define NMAX 100005

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

int n, m;
int FA[NMAX], GR[NMAX];

void init() {
    for (int i = 1; i <= n; i++) {
        FA[i] = i;
        GR[i] = 1;
    }
}

int fatherOf(int node) {
    int aux;
    for (int f = node; FA[f] != f; f = FA[f]);
    for (; FA[node] != node;) {
        aux = FA[node];
        FA[node] = f;
        node = aux;
    }
    return f;
}

void merge(int x, int y) {
    int rx = fatherOf(x);
    int ry = fatherOf(y);

    if (rx != ry) {
        if (GR[rx] < GR[ry]) {
            FA[rx] = ry;
        } else if (GR[rx] > GR[ry]) {
            FA[ry] = rx;
        } else {
            FA[ry] = rx;
            GR[rx]++;
        }
    }
}

void read() {
    f >> n >> m;
    init();
    for (int i = 1; i <= m; i++) {
        int t, x, y;
        f >> t >> x >> y;
        switch (t) {
            case 1:
                merge(x,y);
                break;
            case 2:
                if (fatherOf(x) == fatherOf(y)) {
                    g << "DA\n";
                } else {
                    g << "NU\n";
                }
                break;
            default:
                cout << "Illegal operation!";
                return;
        }
    }
}

int main() {

    read();

    f.close();
    g.close();

    return 0;
}