Cod sursa(job #2491612)

Utilizator FrostfireMagirescu Tudor Frostfire Data 12 noiembrie 2019 20:41:02
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>
#define NMAX 100000

using namespace std;

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

int n, m, rang[NMAX+10], tata[NMAX+10];

int findSet(int x)
{
    int r = x, y = x;
    while(tata[r] != r) r = tata[r];
    while(tata[x] != x)
        {   x = tata[y];
            tata[y] = r;
            y = x;
        }
    return r;
}

void unite(int x, int y)
{
    if(rang[x] > rang[y]) tata[y] = x;
    else tata[x] = y;

    if(rang[x] == rang[y]) rang[y]++;
}


int main()
{
    f >> n >> m;
    for(int i=1; i<=n; i++) tata[i] = i;
    while(m--)
        {   int cer, x, y;
            f >> cer >> x >> y;
            if(cer == 1) unite(findSet(x), findSet(y));
            else
                {   if(findSet(x) == findSet(y)) g << "DA" << '\n';
                    else g << "NU" << '\n';
                }
        }
    return 0;
}