Cod sursa(job #2808210)

Utilizator Angel2IonitaAngel Ionita Angel2Ionita Data 24 noiembrie 2021 18:31:14
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream f("disjoint.in");
ofstream o("disjoint.out");

class DisjointSets
{
    vector<int> rank, parent;
    int size;
public:
    DisjointSets(int n)
    {
        size = n;
        rank.resize(size);
        parent.resize(size);
        for (int i = 0; i < size; i++)
        {
            parent[i] = i;
            rank[i] = 1;
        }
    }
    int find(int x)
    {
        int y,r=x;
        while (parent[r] != r)
            r = parent[r];
        while(parent[x]!=x)
        {
            y=parent[x];
            parent[x]=r;
            x=y;
        }
        return r;
    }

    void Union(int x, int y)
    {

        int fx = find(x);
        int fy = find(y);
        if (rank[fx] < rank[fy])
            parent[fx] = fy;
        else
            parent[fy] = fx;
        if(rank[fx]==rank[fy])
            rank[fx]++;
    }
};

int main()
{
    int N, M;
    int cod, x, y;
    f >> N >> M;
    DisjointSets ds(N);
    for (int i = 1; i <= M; i++)
    {
        f >> cod >> x >> y;
        x--;
        y--;
        if (cod == 1)
            ds.Union(x, y);
        else
        {
            if (ds.find(x) == ds.find(y))
                o << "DA" << endl;
            else
                o << "NU" << endl;
        }
    }
    return 0;
}