Cod sursa(job #2422970)

Utilizator andreixxiLungu Andrei andreixxi Data 20 mai 2019 15:10:28
Problema Paduri de multimi disjuncte Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int t[100000], grad[100000], n, m;
int root (int k)
{
    if (t[k] == k)
        return k;
    else
    {
        int answer = root(t[k]);
        t[k] = answer;
        return answer;
    }
}
void unire (int k, int p)
{
    int rk = root(k), rp = root(p);
    if(rk != rp) //sunt in comp diferite
        {
            if (grad[rk] > grad[rp])
                {
                    t[rp] = rk;
                    grad[rk] += grad[rp];
                }
            else
            {
                t[rk] = rp;
                grad[rp] += grad[rk];
            }
        }
}
int main ()
{
    f>>n; //nr multimi
    for(int i=1; i<=n; i++)
    {
        t[i] = i;
        grad[i] = 1;
    }
    f>>m; //nr operatii efectuate
    for(int i=1; i<=m; i++)
    {
        int cod, x, y; //tipul operatiei + 2 nr in [1,n]
        f>>cod>>x>>y;
        if(cod == 1)
            unire(x, y);
        else if (cod == 2)
        {
            if(root(x) != root(y)) //se afla in aceeasi multime
                g<<"NU\n";
            else
                g<<"DA\n";
        }
    }
}