Cod sursa(job #2437037)
Utilizator | Data | 8 iulie 2019 10:56:49 | |
---|---|---|---|
Problema | Paduri de multimi disjuncte | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.3 kb |
#include <fstream>
using namespace std;
ifstream inf("disjoint.in");
ofstream outf("disjoint.out");
const int NMAX = 100001;
int ant[NMAX], h[NMAX];
int main() {
int n, m;
inf >> n >> m;
for(int i = 1; i <= n; i++) {
ant[i] = i;
h[i] = 1;
}
int q, a, b;
for(int i = 0; i < m; i++) {
inf >> q >> a >> b;
if(q == 1) {
// unite(a, b)
while(ant[a] != a) {
ant[a] = ant[ant[a]];
a = ant[a];
}
while(ant[b] != b) {
ant[b] = ant[ant[b]];
b = ant[b];
}
if(h[a] > h[b]) {
ant[b] = a;
h[a] = h[b] = h[a] + h[b];
}
else {
ant[a] = b;
h[a] = h[b] = h[a] + h[b];
}
}
else {
while(ant[a] != a) {
ant[a] = ant[ant[a]];
a = ant[a];
}
while(ant[b] != b) {
ant[b] = ant[ant[b]];
b = ant[b];
}
if(a == b) {
outf << "DA\n";
}
else {
outf << "NU\n";
}
}
}
return 0;
}