Mai intai trebuie sa te autentifici.

Cod sursa(job #2805695)

Utilizator MadalinaKopaczMadalina Kopacz MadalinaKopacz Data 21 noiembrie 2021 19:00:16
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
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;
}