Cod sursa(job #2776814)

Utilizator teisanumihai84Mihai Teisanu teisanumihai84 Data 21 septembrie 2021 11:33:26
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("disjoint.in");
ofstream fout ("disjoint.out");
int cod, x, y, t[100001], n, m, i;
int rad (int nod)
{
    int start=nod;
    while (t[nod]>0)
        nod=t[nod];
    if (start!=nod)
    t[start]=nod;
    return nod;
}
int main()
{
    fin>>n>>m;
    ///ca sa verific daca 2 noduri fac parte din aceasi componenta conexa ma uit la arborii cu radacina fixata
    /// si merg din nod la radacina, daca cele 2 noduri au aceeasi radacina sunt in aceasi comp conexa
    ///pun in t[radacina]=-inaltimea arborelui
    ///cand unesc 2 componente conexe compar inaltimile curente ale componentelor, daca sunt egale atunci
    /// inaltimea noului arbore creste cu 1, altfel ramane constanta; unesc radacina arborelui mai mic
    /// de radacina arborelui mai mare
    /// compresia drumului: dupa ce parcurg un drum de la nodul curent la radacina pun direct radacina ca tatal nodului
    for (i=1; i<=m; i++)
    {
        fin>>cod>>x>>y;
        if (cod==2)
        {
            int rx=rad(x);
            int ry=rad(y);
            if (rx==ry)
                fout<<"DA\n";
            else
                fout<<"NU\n";
        }
        else
        {
            int rx=rad(x);
            int ry=rad(y);
            if (rx!=ry)
            {
                if (t[rx]==t[ry])
                {
                    t[ry]=rx;
                    t[rx]--;
                }
                if (-t[rx]>-t[ry])
                {
                    t[ry]=rx;
                }
                if (-t[rx]<-t[ry])
                {
                    t[rx]=ry;
                }
            }
        }
    }
}