Pagini recente » Cod sursa (job #2444148) | Cod sursa (job #2284829) | Cod sursa (job #724495) | Cod sursa (job #652250) | Cod sursa (job #1158678)
#include <fstream>
#define in "disjoint.in"
#define out "disjoint.out"
#define Max_Size 100009
#define YES "DA\n"
#define NOT "NU\n"
std :: ifstream f(in);
std :: ofstream g(out);
int N, M, P[Max_Size], Rank[Max_Size];
class DSU {
public :
void Init();
int Find(int);
void Union(int, int);
};
void DSU :: Init() {
for(int i = 1; i <= N; ++i) P[i] = i;
}
int DSU :: Find(int node) {
int Root, aux;
for(Root = node; Root != P[Root]; Root = P[Root]);
while(node != P[node]) {
aux = P[node];
P[node] = Root;
node = aux;
}
return Root;
}
void DSU :: Union(int node, int node1) {
if(Rank[node] < Rank[node1]) P[node] = node1;
if(Rank[node] > Rank[node1]) P[node1] = node;
if(Rank[node] == Rank[node1]) {
++Rank[node1];
P[node1] = node;
}
}
int main() {
f >> N >> M;
DSU obj;
obj.Init();
for(int t, x, y, i = 1; i <= M; ++i) {
f >> t >> x >> y;
if(t == 1) obj.Union(obj.Find(x), obj.Find(y));
else {
if(obj.Find(x) == obj.Find(y)) g << YES;
else g << NOT;
}
}
g.close();
return 0;
}