Cod sursa(job #1204382)

Utilizator diana97Diana Ghinea diana97 Data 2 iulie 2014 19:52:25
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int NMAX = 100000 + 1;

int n, m;
int t[NMAX], r[NMAX];

void initializeaza () {
    f >> n >> m;
    for (int i = 1; i <= n; i++) t[i] = i, r[i] = 1;
}

int cauta (int x) {
    int rd = x, y;
    while (rd != t[rd]) rd = t[rd];
    while (t[x] != x) {
        y = t[x]; t[x] = rd; x = y;
    }
    return rd;
}

void uneste (int x, int y) {
    if (r[x] > r[y]) t[y] = x;
    else t[x] = y;
    if (r[x] == r[y]) r[y]++;
}

void rezolva () {
    int q, x, y;
    for (int i = 1; i <= m; i++) {
        f >> q >> x >> y;
        if (q == 2) {
            if(cauta(x) == cauta(y)) g << "DA";
            else g << "NU";
            g << '\n';
        }
        else {
            uneste(cauta(x), cauta(y));
        }
    }
}


int main() {
    initializeaza();
    rezolva();
    return 0;
}