Cod sursa(job #2560092)

Utilizator sipdavSipos David Oliver sipdav Data 27 februarie 2020 19:18:27
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>

using namespace std;

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

const int dim = 100001;

struct nod
{
    int r;
    nod* p;
};

int n, m;
nod* mu[dim];

nod* multime(nod* x)
{
    if(x != x->p)
        x->p = multime(x->p);
    return x->p;
}

void unite(nod* x, nod* y)
{
    nod* a = multime(x);
    nod* b = multime(y);
    if(a->r < b->r)
        a->p = b;
    else if(b->r < a->r)
        b->p = a;
    else
    {
        a->p = b;
        (b->r)++;
    }
}

void solve()
{
    int c, x, y;
    for(int i = 1;i <= n;i++)
    {
        mu[i] = new nod;
        mu[i]->r = 0;
        mu[i]->p = mu[i];
    }
    for(int i = 1;i <= m;i++)
    {
        in>>c>>x>>y;
        if(c == 1)
            unite(mu[x], mu[y]);
        else
        {
            if(multime(mu[x]) == multime(mu[y]))
                out<<"DA"<<'\n';
            else
                out<<"NU"<<'\n';
        }
    }
}

int main()
{
    in>>n>>m;
    solve();
    return 0;
}