Mai intai trebuie sa te autentifici.
Cod sursa(job #2805695)
Utilizator | 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;
}