Cod sursa(job #2600502)

Utilizator Katherine456719Swan Katherine Katherine456719 Data 12 aprilie 2020 18:49:14
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("disjoint.in");
ofstream g("disjoint.out");
int f[100005],h[100005];
int father(int nod)
{
    int intermediar=nod;
    while(intermediar!=f[intermediar])
        intermediar=f[intermediar];
    while(nod!=f[nod])
    {
        int initial=f[nod];
        f[nod]=intermediar;
        nod=initial;
    }
    return intermediar;
}
void unire(int fx,int fy)
{
    if(h[fx]>h[fy])
        f[fx]=fy;
    if(h[fx]<h[fy])
        f[fy]=fx;
    else
    {
        f[fy]=fx;
        h[fy]+=1;
    }
}
int main()
{
    int n,m;
    ios::sync_with_stdio(false);
    fin.tie(0);
    g.tie(0);
    fin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        f[i]=i;
        h[i]++;
    }
    for(int i=1; i<=m; i++)
    {
        int op,x,y;
        fin>>op>>x>>y;
        if(op==1)
        {
            int fx=father(x),fy=father(y);
            if(fx!=fy)
                unire(fx,fy);
        }
        else
        {
            if(father(x)==father(y))
                g<<"DA\n";
            else
                g<<"NU\n";
        }
    }
    return 0;
}