Cod sursa(job #2154457)

Utilizator tuddor1234Turdasan Tudor tuddor1234 Data 6 martie 2018 22:55:54
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>

#define maxSize 100002

using namespace std;

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

int TT[maxSize];
int RG[maxSize];
int n,m,cer,x,y;

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

    //merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
    for (R = x; TT[R] != R; R = TT[R]);

    //aplic compresia drumurilor
    for (; TT[x] != x;)
    {
        y = TT[x];
        TT[x] = R;
        x = y;
    }
    return R;
}

void unite(int x, int y)
{
    //unesc multimea cu rang mai mic de cea cu rang mai mare
    if (RG[x] > RG[y])
        TT[y] = x;
            else TT[x] = y;

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


int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++){ TT[i]=i;RG[i]=1;}

    for(int i=1;i<=m;i++)
    {
        fin>>cer>>x>>y;
        if(cer==1) unite(find(x),find(y));
        else
        {
            if(find(x)==find(y)) fout<<"DA";
            else fout<<"NU";
            fout<<'\n';
        }


    }

    return 0;
}