Cod sursa(job #2134989)

Utilizator Neamtu_StefanStefan Neamtu Neamtu_Stefan Data 18 februarie 2018 15:03:39
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin;
ofstream fout;

int tatic[100002], r[100002];
int n, m;

void initializare()
{
    for(int i=1; i<=n; ++i)
        tatic[i]=i, r[i]=1;
}

int root(int x)
{
    int i;
    for(i=x; i!=tatic[i]; i=tatic[i]);
    while (x!=tatic[x])
    {
        int temp=tatic[x];
        tatic[x]=i;
        x=temp;
    }
    return i;
}

void Union(int x, int y)
{
    if (r[x] > r[y])
        tatic[y]=x;
    else
        tatic[x]=y;
    if (r[x]==r[y])
        ++r[y];
}

int main()
{
    fin.open("disjoint.in");
    fout.open("disjoint.out");

    fin >> n >> m;

    initializare();

    while(m)
    {
        --m;
        int cod;
        fin >> cod;
        if (cod==1)
        {
            int x, y;
            fin >> x >> y;
            Union(x, y);
        }
        else
        {
            int x, y;
            fin >> x >> y;
            if (root(x)==root(y))
                fout << "DA\n";
            else
                fout << "NU\n";
        }
    }

    return 0;
}