Cod sursa(job #1867083)

Utilizator popescu.octavianPopescu Octavian popescu.octavian Data 3 februarie 2017 18:41:08
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#define pb push_back
#define NMax 100010
#define nod pair<int, int>

using namespace std;

int N, M, tata[NMax], rang[NMax], i, cod, x, y;

int radacina(int x)
{
    int rad, y;

    rad=tata[x];
    while(tata[rad]!=rad)// aflu radacina multimii in care se afla x
        rad=tata[rad];

    while(tata[x]!=x)// atribui fiecarui element din arborele lui x radacina deja aflata
    {
        y=tata[x];
        tata[y]=rad;
        x=y;
    }
    return rad;
}

void unire(int x, int y)
{
    if(rang[x]>rang[y])// unesc multimile prin schimbarea radacinilor
        tata[x]=y;
        else tata[y]=x;
    if(rang[x]==rang[y])// daca au ranguri egale maresc rangul noii multimi cu 1
        rang[x]++;
}
int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d %d\n",&N,&M);

    for(i=1; i<=N; i++)// fiecare arbore are rang 1 si radacina sa e i
    {
        tata[i]=i;
        rang[i]=1;
    }

    for(i=1; i<=M; i++)
    {
        scanf("%d %d %d\n",&cod,&x,&y);
        if(cod==1)
        {
            unire(radacina(x), radacina(y));
        }
        else
        {
            if(radacina(x)==radacina(y)) printf("DA\n");
            else printf("NU\n");
        }
    }
    return 0;
}