Cod sursa(job #2566850)

Utilizator AltexStefanButacu Stefan AltexStefan Data 3 martie 2020 13:25:06
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
#define  NMAX 100005
using namespace std;
ifstream f("disjoint.in");
ofstream g("dijoint.out");
int root[NMAX],sz[NMAX];
int N,M;
int find_rad(int p)
{
    int radacina = p,urm;
    while(radacina != root[radacina])
        radacina = root[radacina];
    while(p != radacina)
    {
        urm = root[p];
        root[p] = radacina;
        p = urm;
    }
    return radacina;
}
void Union(int p , int q)
{
    int rad1,rad2;
    rad1 = find_rad(p);
    rad2 = find_rad(q);
    if(rad1 != rad2)
    {
        if(sz[rad1] < sz[rad2])
        {
            sz[rad2] += sz[rad1];
            root[rad1] = rad2;
        }
        else
        {
            sz[rad1] += sz[rad2];
            root[rad2] = rad1;
        }
    }
}
void solve()
{
    int N,i,j,var;
    int Rad1,Rad2;
    f >> N>> M ;
    for(int i = 1 ; i <= N; i++)
    {
        root[i] = i;
        sz[i] = 1;
    }

    while(M)
    {
        f >> var >> i >> j;
        if(var == 1)
            Union(i,j);
        else
            {
                Rad1= find_rad(i);
                Rad2= find_rad(j);
                if(Rad1 == Rad2)
                    g << "DA" <<'\n';
                else
                    g << "NU" <<'\n';
            }
        N--;
    }
}
int main()
{
    solve();
    return 0;
}