Cod sursa(job #1786618)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 23 octombrie 2016 13:31:25
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <cstdio>

using namespace std;

int n, m;

class paduriDisjuncte
{
private:

    int parinte[100005];
    int adancimi[100005];

    int gasireParinte(int x)
    {
        int xx = x;

        while(parinte[x] != x)
        {
            x = parinte[x];
        }

        while(parinte[xx] != xx)
        {
            parinte[xx] = x;

            xx = parinte[xx];
        }

        return x;
    }

public:

    paduriDisjuncte()
    {
        for(int i = 0; i < 100005; i++)
        {
            parinte[i] = i;
            adancimi[i] = 0;
        }
    }

    void unire(int x, int y)
    {
        int ad1 = adancimi[x];
        int ad2 = adancimi[y];

        if(ad1 < ad2)
        {
            parinte[gasireParinte(x)] = gasireParinte(y);
        }
        else if(ad1 > ad2)
        {
            parinte[gasireParinte(y)] = gasireParinte(x);
        }
        else
        {
            parinte[gasireParinte(x)] = gasireParinte(y);
            adancimi[x]++;
        }
    }

    bool suntUnite(int x, int y)
    {
        if(gasireParinte(x) == gasireParinte(y))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}padure;

void citire()
{
    scanf("%d %d", &n, &m);

    int tmp1, tmp2, tmp3;

    for(int i = 0; i < m; i++)
    {
        scanf("%d %d %d", &tmp1, &tmp2, &tmp3);

        if(tmp1 == 1)
        {
            padure.unire(tmp2, tmp3);
        }
        else if(tmp1 == 2)
        {
            if(padure.suntUnite(tmp2, tmp3))
            {
                printf("DA\n");
            }
            else
            {
                printf("NU\n");
            }
        }
    }
}

int main()
{
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);

    citire();

    return 0;
}