Cod sursa(job #1821486)

Utilizator stefii_predaStefania Preda stefii_preda Data 3 decembrie 2016 11:13:16
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <fstream>

using namespace std;
ifstream in ("disjoint.in");
ofstream out ("disjoint.out");

const int N = 100005;
int tata[N], niv[N], n, m;

void myunion (int r1, int r2)
{
    if(niv[r1] < niv[r2])
        tata[r1] = r2;
    else if(niv[r2] < niv[r1])
        tata[r2] = r1;
    else
    {
        tata[r1] = r2;
        niv[r2]++;
    }
}

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


int main()
{
    in >> n >> m;
    int i;
    for(i = 1; i <= n; i++)
        tata[i] = i;
    int cod, x, y;
    for(i = 1; i <= m; i++)
    {
        in >> cod >> x >> y;
        if (cod == 1)
            myunion(x, y);
        else
        {
            if(find(x) == find(y))
                out << "DA\n";
            else out << "NU\n";
        }
    }
    return 0;
}