Cod sursa(job #1733383)

Utilizator Lungu007Lungu Ionut Lungu007 Data 24 iulie 2016 16:37:50
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100001
using namespace std;

int t[NMAX],r[NMAX],n,m,p,x,y;

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

int Find(int x)
{
    int r = x,aux;

    while(r!=t[r]) r = t[r];

    while(x!=r)
    {
        aux = t[x];
        t[x] = r;
        x = aux;
    }

    return r;
}

void Union(int x,int y)
{
    int r1,r2;
    r1 = Find(x);
    r2 = Find(y);

    if(r[r1]<r[r2])
    {
        t[r1] = r2;
    }
    else if(r[r1]>r[r2])
    {
        t[r2] = r1;
    }
    else
    {
        t[r1] = r2;
        r[r2]++;
    }
}

int main()
{
    in >> n >> m;


    for(int i=1;i<=n;i++)
    {
        t[i] = i;
        r[i] = 1;
    }

    for(int i=0;i<m;i++)
    {
        in >> p >> x >> y;
        if(p==1)
        {
            Union(x,y);
        }
        else
        {
            if(Find(x)==Find(y))
            {
                out << "DA\n";
            }
            else
            {
                out << "NU\n";
            }
        }
    }
    return 0;
}