Pagini recente » Cod sursa (job #1164024) | Cod sursa (job #2880071) | Cod sursa (job #406672) | Cod sursa (job #1854664) | Cod sursa (job #2273548)
#include <bits/stdc++.h>
using namespace std;
class DisjointSet{
private:
int Size;
int *Rank,*Parent;
void Init(){
for(int i=1;i<=Size;++i){
Rank[i]=1;
Parent[i]=i;
}
}
public:
DisjointSet(int Size):Size{Size},Rank{new int[Size+1]},Parent{new int[Size+1]}{
Init();
}
int Find(int x){
int Root=x;
while(Parent[Root]!=Root)
Root=Parent[Root];
while(x!=Root){
Parent[x]=Root;
x=Parent[x];
}
return Root;
}
void Unite(int x,int y){
int xRoot=Find(x),yRoot=Find(y);
if(xRoot!=yRoot){
if(Rank[xRoot]>Rank[yRoot])
Parent[yRoot]=xRoot;
else{
if(Rank[xRoot]==Rank[yRoot])
++Rank[yRoot];
Parent[xRoot]=yRoot;
}
}
}
bool Connected(int x,int y){
return Find(x)==Find(y);
}
};
DisjointSet A(100005);
int main(){
freopen("disjoint.in","r",stdin);
freopen("disjoint.out","w",stdout);
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;++i){
int cod,x,y;
scanf("%d %d %d",&cod,&x,&y);
if(cod==1) A.Unite(x,y);
else{
if(A.Connected(x,y)) printf("DA\n");
else printf("NU\n");
}
}
return 0;
}