Cod sursa(job #2231474)

Utilizator stefan.botezStefan Botez stefan.botez Data 14 august 2018 15:11:21
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <map>
#include <vector>

using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int n, m, op, x, y;
class Disjoint {
    private:
        int sz;
        vector<int> parent;
        vector<int> rnk;
    public:
        Disjoint(int szz) : sz(szz + 1) {
            parent.resize(sz);
            rnk.resize(sz);
            for (int i = 0; i < sz; i++) {
                parent[i] = i;
                rnk[i] = 0;
            }
        }

        void Uneste(int x, int y) {
            if(rnk[y] >= rnk[x])
            {
                if(rnk[y] == rnk[x])
                    rnk[y]++;
                parent[x] = y;
            }
            else parent[y] = x;
        }

        int FindSet(int x) {
            if (parent[x] != x) {
                parent[x] = FindSet(parent[x]);
            }
            return parent[x];
        }
};
int main()
{
    f>>n>>m;
    Disjoint d(n);

    for(;m;m--)
    {
        f>>op>>x>>y;
        if(op == 1)
            d.Uneste(d.FindSet(x), d.FindSet(y));
        else {
            if(d.FindSet(x) == d.FindSet(y))
                g<<"DA"<<endl;
            else g<<"NU"<<endl;
        }
    }
    return 0;
}