Cod sursa(job #1704919)

Utilizator nenciu.biancaNenciu Bianca nenciu.bianca Data 19 mai 2016 16:28:53
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <queue>
#include <vector>
#include <fstream>
#include <iostream>
#include <algorithm>

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

int n, m;

vector<int> parent;
vector<int> Rank;

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

void Union(int nodeX, int nodeY)
{
    int x = Find(nodeX), y = Find(nodeY);

    if (Rank[x] < Rank[y]) {
        parent[x] = y;
    }
    else if (Rank[x] > Rank[y]) {
        parent[y] = x;
    }
    else {
        parent[x] = y;
        Rank[y]++;
    }
}

int main()
{
    f >> n >> m;
    parent.resize(n + 1);
    Rank.resize(n + 1);
    for (int i = 1; i <= n; ++i) {
        parent[i] = i;
        Rank[i] = 1;
    }

    for (int i = 1; i <= m; ++i) {
        int a, b, op;
        f >> op >> a >> b;

        if (op == 1) {
            Union(a, b);
        }

        if (op == 2) {
            if (Find(a) == Find(b)) {
                g << "DA\n";
            }
            else
                g << "NU\n";
        }
    }
    return 0;
}