Cod sursa(job #972330)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 11 iulie 2013 14:39:00
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>
using namespace std;

const int MAX_N = 100002;

int N, M;
int H[MAX_N], F[MAX_N];

inline int find(int x) {
    int R = x;
    while(R != F[R])
        R = F[R];
    while(F[x] != x) {
        int temp = F[x];
        F[x] = R;
        x = temp;
    }

    return R;
}

inline void unite(int x, int y) {
    if(H[x] > H[y])
        F[y] = x;
    else F[x] = y;
    if(H[x] == H[y])
        ++H[y];
}

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

    f >> N >> M;
    for(int i = 1; i <= N; ++i)
        F[i] = i, H[i] = 1;
    for(int i = 1, t, x, y; i <= M; ++i) {
        f >> t >> x >> y;
        if(t == 1)
            unite(F[x], F[y]);
        else if(find(F[x]) == find(F[y]))
            g << "DA\n";
            else g << "NU\n";
    }

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

    return 0;
}