Pagini recente » Cod sursa (job #19027) | Cod sursa (job #1136172) | Cod sursa (job #2119651) | Cod sursa (job #466279) | Cod sursa (job #2852403)
#include <fstream>
#define NMax 100005
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int N,M;
int R[NMax], Depth[NMax];
void init(){
for(int i = 1; i <= N; i++)
R[i] = i, Depth[i] = 1;
}
int findTrueRepr(int x){
int init = x;
while(R[R[x]] != R[x]){
x = R[x];
}
x=R[x];
while(R[init] != x){
int next = R[init];
R[init] = x;
init = next;
}
return x;
}
bool areFromTheSameSet(int x, int y){
return findTrueRepr(x) == findTrueRepr(y);
}
void unite(int x, int y){
int rx = findTrueRepr(x);
int ry = findTrueRepr(y);
if(rx == ry)
return;
if(Depth[rx] > Depth[ry])
R[ry] = rx;
if(Depth[rx] < Depth[ry])
R[rx] = ry;
if(Depth[rx] == Depth[ry]){
R[rx] = ry;
Depth[ry] += 1;
}
}
int main()
{
int a,b,c,i;
fin>>N>>M;
init();
for(i=1;i<=M;i++)
{
fin>>a>>b>>c;
if(a==1)
unite(b,c);
else
{
if(findTrueRepr(b)==findTrueRepr(c))
fout<<"DA"<<"\n";
else
fout<<"NU"<<"\n";
}
}
return 0;
}