Cod sursa(job #2602451)

Utilizator clau_rClaudia clau_r Data 16 aprilie 2020 22:26:19
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <limits>
#include <vector>
#include <queue>

#define NMAX 100020

using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

int find(vector<int>& parent, int a) {
    int parenta = a;
    while (parenta != parent[parenta]) {
        parenta = parent[parenta];
    }

    while (a != parent[parenta]) {
        int tmp = parent[a];
        parent[a] = parenta;
        a = tmp;
    }

    return parenta;
}


void union_find(vector<int>& rank, vector<int>& parent, int a, int b) {
    int parent_a = find(parent,a);
    int parent_b = find(parent,b);
    if (rank[parent_a] >= rank[parent_b]) {
        parent[parent_b] = parent_a;
    } else {
        parent[parent_a] = parent_b;
    }

    if (rank[parent_a] == rank[parent_b]) {
        ++rank[parent_a];
    }
}


int main()
{
    int n, m, idx, a, b;
    fin>>n>>m;
    vector<int> parent(n);
    vector<int> rank(n);
    
    for (int i = 0; i < n; ++i) {
        parent[i] = i;
        rank[i] = 1;
    }
     
    vector<string> ret; 
    for (int i=0; i<m; ++i) {
        fin>>idx>>a>>b;
        if (idx == 2) {
            ret.push_back(find(parent,a) == find(parent,b) ? "DA\n" : "NU\n");
        } else {
           union_find(rank, parent, a, b);
        }
    }

    for (int i = 0; i < ret.size(); ++i) {
        fout<<ret[i];
    }
    fin.close();
    fout.close();

}