Mai intai trebuie sa te autentifici.
Cod sursa(job #2797240)
Utilizator | Data | 9 noiembrie 2021 16:39:16 | |
---|---|---|---|
Problema | Paduri de multimi disjuncte | Scor | 40 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.04 kb |
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std ;
ifstream fin("disjoint.in") ;
ofstream fout("disjoint.out") ;
int n , m , t[100005] , h[100005] , tx , ty ;
int findSet(int x) {
while(t[x]!=x)
x = t[x] ;
return x ;
}
void unionSet(int x , int y) {
if(h[x] > h[y]) {
t[y] = x ;
} else if(h[y] > h[x]) {
t[x] = y ;
} else {
t[y] = x ;
h[x]++ ;
}
}
int main() {
int x , y , operatie;
fin >> n >> m ;
for(int i = 1 ;i<=n ;i++) {
t[i] = i ;
h[i] = 1 ;
}
for(int i = 1 ;i<=m ;i++) {
fin >> operatie >> x >> y ;
if(operatie == 1) {
tx = findSet(x) ;
ty = findSet(y) ;
if(tx != ty) {
unionSet(tx , ty) ;
}
} else if(operatie == 2){
int tx = findSet(t[x]) ;
int ty = findSet(t[y]) ;
if( tx == ty )
fout << "DA" << endl ;
else fout << "NU" << endl ;
}
}
return 0;
}