Pagini recente » Cod sursa (job #2081902) | Cod sursa (job #1266105) | Cod sursa (job #1638132) | Cod sursa (job #69901) | Cod sursa (job #920188)
Cod sursa(job #920188)
#include <fstream>
#include <vector>
using namespace std;
struct DSFel{
unsigned rank;
DSFel *parent;
DSFel(){rank=0;}
};
DSFel* Find(DSFel* x){
if(x->parent==x) return x;
else{
x->parent=Find(x->parent);
return x->parent;
}
}
void Union(DSFel *x,DSFel *y){
DSFel *xroot=Find(x),*yroot=Find(y);
if(xroot==yroot) return;
if(xroot->rank>yroot->rank)
yroot->parent=xroot;
else if(xroot->rank<yroot->rank)
xroot->parent=yroot;
else{
xroot->parent=yroot;
(yroot->rank)++;
}
}
int main(){
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
unsigned N,M;
fin>>N>>M;
vector<DSFel> elements(N);
for(unsigned i=0;i<N;++i) elements[i].parent=&elements[i];
while(M--){
short t,x,y; fin>>t>>x>>y; x--; y--;
if(t==1) Union(&elements[x],&elements[y]);
if(t==2){
if(Find(&elements[x])==Find(&elements[y])) fout<<"DA\n";
else fout<<"NU\n";
}
}
}