Pagini recente » Cod sursa (job #2708748) | Cod sursa (job #2761299) | Cod sursa (job #1177565) | Cod sursa (job #2554410) | Cod sursa (job #2165694)
#include <bits/stdc++.h>
#define INFILE "disjoint.in"
#define OUTFILE "disjoint.out"
using namespace std;
ifstream in(INFILE);
ofstream out(OUTFILE);
class UnionFind{
public:
void Init(int n){
parent.resize(n+1);
sizeTree.resize(n+1);
for(int i=1;i<=n;i++){
parent[i]=i;
sizeTree[i]=0;
}
}
int FindRoot(int nod){
while(nod!=parent[nod]){
parent[nod]=parent[parent[nod]];
nod=parent[nod];
}
return nod;
}
bool Connected(int nod1, int nod2){
return FindRoot(nod1)==FindRoot(nod2);
}
void Connect(int nod1,int nod2){
int root1=FindRoot(nod1);
int root2=FindRoot(nod2);
if(sizeTree[root1]>sizeTree[root2]){
sizeTree[root1]+=sizeTree[root2];
parent[root2]=root1;
}
else{
sizeTree[root2]+=sizeTree[root1];
parent[root1]=root2;
}
}
private:
vector<int> parent;
vector<int> sizeTree;
};
int main(){
int N,M;
in>>N>>M;
UnionFind uf;
uf.Init(N);
for(int i=1;i<=M;i++){
int tip,x,y;
in>>tip>>x>>y;
if(tip==1){
uf.Connect(x,y);
}
else{
if(uf.Connected(x,y)){
out<<"DA\n";
}
else{
out<<"NU\n";
}
}
}
return 0;
}