Cod sursa(job #1023930)

Utilizator andreip1996Paun Andrei andreip1996 Data 7 noiembrie 2013 21:36:36
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <cstdio>
using namespace std;

int h[100005],tata[100005],n,m;

void unionn(int x, int y)
{
    ///unesc multimea cu rang mai mic de cea cu rang mai mare
    if (h[x] > h[y])
        tata[y] = x;
    else tata[x] = y;
    if (h[x] == h[y]) h[y]++;
}

int find(int x)
{
    int r;
    r=x;
    ///determin radacina arborelui
    while (tata[r])
        r=tata[r];
    ///comprim drumul de la x la r
    int y=x;
    while(y!=r)
    {
        int t=tata[y];
        tata[y]=r;
        y=t;
    }
    return r;
}

int main()
{
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    scanf("%d%d",&n,&m);

    //initial fiecare nod pointeaza catre el insusi iar rangul fiecarui arbore este 1
    for (int i = 1; i <= n; i++)
    {
        //tata[i] = i;
        tata[i] = 0;
        h[i] = 1;
    }

    for (int i = 1; i <= m; i++)
    {
        int cod,x,y;
        scanf("%d%d%d",&cod,&x,&y);
        if (cod == 2)
            //verific daca radacina arborilor in care se afla x respectiv y este egala
            if (find(x) == find(y)) printf("DA\n");
            else printf("NU\n");
        else //unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
                {
                    if (find(x) != find(y))
                            unionn(find(x), find(y));
                }
    }

    return 0;
}