Cod sursa(job #2805699)

Utilizator MadalinaKopaczMadalina Kopacz MadalinaKopacz Data 21 noiembrie 2021 19:08:35
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int N, M;

int findDis(int elem, vector<pair<int, int>> &multimi)
{
    int radacina = elem;
    while(multimi[radacina].first != radacina) {
        radacina= multimi[radacina].first;
    }
 //   while(multimi[elem].first != radacina) {
   //     int auxiliar = multimi[elem].first;
     //   multimi[elem].first = radacina;
       // elem = auxiliar;
    //}
    return radacina;
}

void unionDis(const int x, const int y, vector<pair<int, int>> &multimi)
{
    int radX = findDis(x, multimi), radY = findDis(y, multimi);

    if(multimi[radX].second > multimi[radY].second) {
        multimi[radX].second = multimi[radX].second + multimi[radY].second;
        multimi[radY].first = radX;
    }
    else{
        multimi[radY].second = multimi[radY].second + multimi[radX].second;
        multimi[radX].first = radY;
    }
}


void Disjoint ()
{
    vector<pair<int, int>> multimi(N + 1, {0,0}); //indexare de la 1
    for(int i = 1; i <= N; ++i)
        multimi[i].first = i, multimi[i].second = 1;

    for(int i = 1; i <= M; ++i) {
        int x, y, task;
        fin >> task >> x >> y;

        if (task == 1) {
            if(findDis(x, multimi) != findDis(y, multimi)) {
                unionDis(x, y, multimi);
            }
        }
        else{
            if(findDis(x, multimi) == findDis(y, multimi))
                fout << "DA\n";
            else
                fout << "NU\n";
        }
    }

}

int main()
{
    fin >> N >> M;
    Disjoint();
    return 0;
}