Cod sursa(job #1201406)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 25 iunie 2014 09:56:45
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 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;
}