Cod sursa(job #2413442)

Utilizator diliriciraduDilirici Radu diliriciradu Data 23 aprilie 2019 13:34:43
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <fstream>

using namespace std;

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



int radacina(int v[], int x)
{
    while (x != v[x])
    {
        v[x] = v[v[x]];
        x = v[x];
    }
    return x;
}

void reuniune(int v[], int l[], int x, int y)
{
    if (l[radacina(v, x)] < l[radacina(v, y)])
    {
        v[radacina(v, x)] = v[radacina(v, y)];
    }
    else
    {
        v[radacina(v, y)] = v[radacina(v, x)];
        l[radacina(v, x)]++;
    }
}

void verificare(int v[], int l[], int x, int y)
{
    if (radacina(v, x) == radacina(v, y))
        g<<"DA\n";
    else
        g<<"NU\n";
}

int main()
{
    int N = 0, M;
    int cod, x, y;
    f>>N>>M;

    int v[N+1], l[N+1];
    for (int i = 1; i <= N; i++)
        v[i] = i, l[i] = 1;

    for (int i = 1; i <= M; i++)
    {
        f>>cod>>x>>y;
        switch(cod)
        {
            case 1: reuniune(v, l, x, y); break;
            case 2: verificare(v, l, x, y); break;
            default: break;
        }
    }
    return 0;
}