Cod sursa(job #2470231)

Utilizator uvIanisUrsu Ianis Vlad uvIanis Data 8 octombrie 2019 21:20:01
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#define N_MAX 100000

using namespace std;

size_t id[N_MAX + 1];
size_t sz[N_MAX + 1];


size_t find_root(size_t x)
{
    size_t root = x;

    while(root != id[root]) root = id[root];


    size_t next;

    while(x != root)
    {
        next = id[x];
        id[x] = root;
        x = next;
    }


    return root;
}


void union_sets(size_t x, size_t y)
{
    size_t rootX = find_root(x);
    size_t rootY = find_root(y);

    if(rootX == rootY) return;

    if(sz[rootX] > sz[rootY])
    {
        id[rootY] = rootX;
        sz[rootX] += sz[rootY];
    }
    else {
        id[rootX] = rootY;
        sz[rootY] += sz[rootX];
    }

    return;
}


void disjoint_init()
{
    for(size_t i = 0; i <= N_MAX; ++i)
    {
        sz[i] = 1;
        id[i] = i;
    }
}


int main()
{
    disjoint_init();

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

    size_t N, M;

    fin >> N >> M;


    size_t op, x, y;

    for(size_t i = 1; i <= M; ++i)
    {
        fin >> op >> x >> y;

        if(op == 1) union_sets(x, y);
        else if(find_root(x) == find_root(y)) fout << "DA\n";
        else fout << "NU\n";
    }
}