Cod sursa(job #2808267)

Utilizator Angel2IonitaAngel Ionita Angel2Ionita Data 24 noiembrie 2021 19:54:22
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <vector>

using namespace std;

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

class DisjointSets
{
    int size,*rank,*parent;
public:
    DisjointSets(int n)
    {
        size = n + 1;
        rank=new int[size];
        parent=new int[size];
        for (int i = 1; i < size; i++)
        {
            parent[i] = i;
            rank[i] = 1;
        }
    }
    int Find(int x)
    {
        if (parent[x] == x)
            return x;
        return Find(parent[x]);
    }

    void Union(int x, int y)
    {
        int fx = Find(x);
        int fy = Find(y);
        if (rank[fx] <= rank[fy])
        {
            parent[fx] = fy;
            rank[fy] += rank[fx];
        }
        else
        {
            parent[fy] = fx;
            rank[fx] += rank[fy];
        }
    }
    ~DisjointSets()
    {
        delete[] parent;
        delete[] rank;
    }
};

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;
        if (cod == 1)
            ds.Union(x, y);
        else if (ds.Find(x) == ds.Find(y))
            o << "DA\n";
        else
            o << "NU\n";
    }
    return 0;
}