Cod sursa(job #2647956)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 7 septembrie 2020 17:10:37
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int tt[100001];
int rg[100001];

int find (int x)
{
    int r, y;

    //merg in sus in arbore pana gasesc un nod care pointeaza catre el insusi
    r=x;
    while(tt[r]!=r)
    {
        r=tt[r];
    }

    //cout<<"r= "<<r<<"\n";

    //for(r=x; tt[r] !=r ; r=tt[r]) ;

    //aplic compresia drumurilor
    while(tt[x]!=x)
    {
        y=tt[x];
        tt[x]=r;
        x=y;
    }

    /*for(; tt[x] !=x; )
    {
        y=tt[x];
        tt[x]=r;
        x=y;
    }*/

    return r;
}

void unite (int x, int y)
{
    //unesc multimea cu rand mai mic de cea cu rang mai mare
    if(rg[y]<rg[x])
    {
        tt[y]=x;
    }

    else tt[x]=y;

    //in caz ca rangurile erau egale atunci cresc rangul noii multimi
    if(rg[x]==rg[y]) rg[y]++;
}


int main()
{
    int n, m, i, cod, x, y;
    fin>>n>>m;

    //initial fiecare nod pointeaza catre el insusi si fiecare arbore are rang 1
    for(i=1; i<=n; i++)
    {
        tt[i]=i;
        rg[i]=1;
    }


    for(i=1; i<=m; i++)
    {
        fin>>cod>>x>>y;

        if(cod==1)
        {
            unite ( find(x), find(y) );
        }

        else
        {
            //cout<<"x= "<<x<<"\nfind("<<x<<")= "<<find(x)<<"\ny= "<<y<<"\nfind("<<y<<")= "<<find(y)<<"\n\n";

            if(find(x)==find(y)) fout<<"DA\n";
            else fout<<"NU\n";
        }
    }
}