Cod sursa(job #3252962)

Utilizator tMario2111Neagu Mario tMario2111 Data 31 octombrie 2024 16:30:27
Problema Paduri de multimi disjuncte Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

struct DSU
{
    vector<int> p, h;

    DSU(int n) {
        p.resize(n + 1);
        h.resize(n + 1);
        for (int i = 1; i <= n; ++i)
        {
            p[i] = i;
            h[i] = 1;
        }
    }
    
    int find(int x)
    {
        int r = x;
        while (r != p[x])
            r = p[r];

        // Compresia drumului
        int y = x;
        while (y != r)
        {
            int t = p[y];
            p[y] = r;
            y = r;
        }

        return r;
    }

    void union_(int x, int y)
    {
        x = find(x);
        y = find(y);
        if (h[x] < h[y])
            p[x] = y;
        else
        {
            if (h[x] > h[y])
                p[y] = x;
            else
            {
                p[x] = y;
                h[y]++;
            }
        }
    }
};

int main()
{
    int n, m;
    ifstream f("disjoint.in");
    ofstream g("disjoint.out");
    f >> n >> m;
    DSU d(n);
    for (int i = 1; i <= m; ++i)
    {
        int op, x, y;
        f >> op >> x >> y;
        if (op == 1)
            d.union_(x, y);
        else
        {
            if (d.find(x) == d.find(y))
                g << "DA\n";
            else
                g << "NU\n";
        }
    }
    f.close();
    g.close();
    return 0;
}