Pagini recente » Diferente pentru utilizator/adrian intre reviziile 3 si 2 | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #3363421) | Cod sursa (job #3362163)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("disjoint.in");
ofstream cout ("disjoint.out");
vector<int> parent;
vector<int> rank_sz;
int find_set(int v) {
if (v==parent[v]) {
return v;
}
return parent[v]=find_set(parent[v]);
}
void union_sets(int a, int b) {
a=find_set(a);
b=find_set(b);
if (a!=b) {
if (rank_sz[a]<rank_sz[b]) {
swap(a, b);
}
parent[b]=a;
if (rank_sz[a]==rank_sz[b]) {
rank_sz[a]++;
}
}
}
int main() {
int n,m;
cin>>n>>m;
parent.resize(n+1);
rank_sz.resize(n+1,0);
for (int i=1; i<=n; i++) {
parent[i]=i;
}
for (int i=0; i<m; i++) {
int op,x,y;
cin>>op>>x>>y;
if (op==1) {
union_sets(x,y);
} else if (op==2) {
if (find_set(x)==find_set(y)) {
cout<<"DA\n";
} else {
cout<<"NU\n";
}
}
}
}