Cod sursa(job #2682255)

Utilizator raducostacheRadu Costache raducostache Data 8 decembrie 2020 12:01:44
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
//
//  main.cpp
//  union find
//
//  Created by Radu Costache on 07/12/2020.
//  Copyright © 2020 Radu Costache. All rights reserved.
//

#include <fstream>

#define NMAX 100005

using namespace std;

int n, q;
int parent[NMAX], rang[NMAX];

inline void Union(int, int);
inline int   Find(int);

int main(int argc, const char * argv[]) {
    // insert code here...
    ifstream f("disjoint.in");
    ofstream g("disjoint.out");
    f >> n >> q;
    for (int i = 1; i <= n; ++i)
        parent[i] = i;
    while (q--) {
        int type, x, y;
        f >> type >> x >> y;
        switch (type) {
            case 1:
                Union(x, y);
                break;
            case 2:
                if (Find(x) == Find(y))
                    g << "DA\n";
                else g << "NU\n";
                break;
            
        }
    }
    return 0;
}

inline int Find(int node) {
    if (parent[node] != node)
        parent[node] = Find(parent[node]);
    return parent[node];
}

inline void Union(int x, int y) {
    int px = Find(x);
    int py = Find(y);
    
    if (px == py)
        return;
    if (rang[px] < rang[py])
        parent[px] = py;
    else if (rang[px] > rang[py])
        parent[py] = px;
    else {
        parent[px] = py;
        ++rang[py];
    }
    
}