Mai intai trebuie sa te autentifici.
Cod sursa(job #2397158)
Utilizator | Data | 4 aprilie 2019 11:14:27 | |
---|---|---|---|
Problema | Paduri de multimi disjuncte | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.18 kb |
#include <fstream>
#include <vector>
std::ifstream fin("disjoint.in", std::ifstream::in);
std::ofstream fout("disjoint.out", std::ofstream::out);
void _union(std::vector<int>& comp, std::vector< std::vector<int> >& subset, int x, int y) {
size_t comp_x = comp[x], comp_y = comp[y];
if (subset[comp[x]].size() <= subset[comp[y]].size()) {
size_t size1 = subset[comp_x].size();
for (int i = 0; i < size1; i++) {
subset[comp_y].push_back(subset[comp_x][i]);
comp[subset[comp_x][i]] = comp_y;
}
subset[comp_x].clear();
} else {
size_t size2 = subset[comp_y].size();
for (int i = 0; i < size2; i++) {
subset[comp_x].push_back(subset[comp_y][i]);
comp[subset[comp_y][i]] = comp_x;
}
subset[comp_y].clear();
}
}
void _check(std::vector<int>& comp, int x, int y) {
if (comp[x] == comp[y])
fout << "DA\n";
else
fout << "NU\n";
}
int main() {
int n, m, cod, x, y;
fin >> n >> m;
std::vector<int>comp(n + 1);
std::vector< std::vector<int> >subset(n + 1);
for (int i = 1; i <= n; i++) {
comp[i] = i;
subset[i].push_back(i);
}
for (int i = 0; i < m; i++) {
fin >> cod >> x >> y;
if (cod == 1)
_union(comp, subset, x, y);
else
_check(comp, x, y);
}
}