Mai intai trebuie sa te autentifici.
Cod sursa(job #2517353)
Utilizator | Data | 3 ianuarie 2020 13:49:27 | |
---|---|---|---|
Problema | Paduri de multimi disjuncte | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 0.82 kb |
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int n, m;
int tre[100041], gr[100041];
void ha(){
for(int i = 1; i <= n; ++i){
tre[i] = i;
gr[i] = 1;
}
}
int dad(int a){
while(tre[a] != a){
a = tre[a];
}
return a;
}
int yelo(int a, int b){
tre[a] = b;
gr[b] += gr[a];
}
void reu(int a, int b){
a = dad(a);
b = dad(b);
if(gr[a] < gr[b]){
yelo(a, b);
}else{
yelo(b, a);
}
}
bool fid(int a, int b){
return (dad(a)==dad(b));
}
int main(){
fin >> n >> m;
ha();
for(int i = 0; i < m; ++i){
int op, a, b;
fin >> op >> a >> b;
if(op == 1){
reu(a, b);
}else{
if(fid(a, b)){
fout << "DA";
}else{
fout << "NU";
}
fout << "\n";
}
}
return 0;
}