Pagini recente » Cod sursa (job #2825842) | Cod sursa (job #2557948) | Cod sursa (job #1696521) | Cod sursa (job #700145) | Cod sursa (job #2951557)
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
//ifstream cin ("input"); ofstream cout ("output");
ifstream cin ("disjoint.in"); ofstream cout ("disjoint.out");
vector<int> tata, cardinal;
int gasesteTata(int node){
if (node != tata[node]) {
tata[node] = gasesteTata(tata[node]);
}
return tata[node];
}
void uneste(int nodA, int nodB) {
nodA = gasesteTata(nodA);
nodB = gasesteTata(nodB);
if (cardinal[tata[nodA]] > cardinal[tata[nodB]]) {
// torn ce este in B in A
cardinal[tata[nodA]] += cardinal[tata[nodB]];
cardinal[tata[nodB]] = 0;
tata[nodB] = tata[nodA];
}
else {
// torn ce este in A in B
cardinal[tata[nodB]] += cardinal[tata[nodA]];
cardinal[tata[nodA]] = 0;
tata[nodA] = tata[nodB];
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n, m;
cin>>n>>m;
tata.resize(n+1);
cardinal.resize(n+1);
for (int i=1; i<=n; i++){
tata[i] = i;
cardinal[i] = 1;
}
for (int i=1; i<=m; i++){
int op, x, y;
cin>>op>>x>>y;
if (op == 1) { // adaug o galeata la alta
uneste(x, y);
}
else{
int tataX = gasesteTata(x), tataY = gasesteTata(y);
if (tataX == tataY){
cout<<"DA"<<'\n';
}
else{
cout<<"NU"<<'\n';
}
}
}
return 0;
}