Pagini recente » Cod sursa (job #3291473) | Cod sursa (job #897023) | Cod sursa (job #2033304) | Cod sursa (job #2901576) | Cod sursa (job #2802422)
#include <bits/stdc++.h>
#include<fstream>
#include<vector>
#include<map>
#include<queue>
std::ifstream f("disjoint.in");
std::ofstream fg("disjoint.out");
int n, m, a, b, c;
class graf{
public:
int n, m;
graf(int n, int m);
void disjoint();
int find_set(int nod, std::vector<int> &tata);
void union_set(int nod1, int nod2, std::vector<int> &tata, std::vector<int> adancime);
};
graf::graf(int n, int m) {
this->n = n;
this->m = m;
}
int graf::find_set(int nod, std::vector<int> &tata) {
if( nod == tata[nod]) return nod;
return tata[nod] = find_set(tata[nod], tata);
}
void graf::union_set(int nod1, int nod2, std::vector<int> &tata, std::vector<int> adancime){
nod1 = find_set(nod1, tata);
nod2 = find_set(nod2, tata);
if(nod1 != nod2) {
if( adancime[nod1] < adancime[nod2]) std::swap( nod1, nod2);
tata[nod2] = nod1;
if(adancime[nod1] == adancime[nod2]) adancime[nod1]++;
}
nod1 = find_set(nod1, tata);
nod2 = find_set(nod2, tata);
}
void graf::disjoint(){
std::vector<int> tata;
std::vector<int> adancime;
int op;
for(auto i = 0 ; i<=n ; i++){
tata.push_back(i);
adancime.push_back(0);
}
for(int i=0 ; i<m ; i++){
f>>op>>a>>b;
if(op == 1){
union_set(a, b, tata, adancime);
}
if(op == 2){
a = find_set(a, tata);
b = find_set(b, tata);
if(a!=b) fg<<"NU\n";
else fg<<"DA\n";
}
}
}
int main() {
f>>n>>m;
graf g(n, m);
g.disjoint();
return 0;
}