Pagini recente » Monitorul de evaluare | Cod sursa (job #1167487) | Cod sursa (job #702123) | Cod sursa (job #1168403) | Cod sursa (job #1929845)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
int n, m, op, x, y;
struct edges{
int src, dest;
}e[100002];
struct subset{
int parent, rnk;
}s[100002];
void makeSet(){
for(int i = 1; i <= n; i++){
s[i].parent = i;
s[i].rnk = 0;
}
}
int findSet(int x){
if(x != s[x].parent) s[x].parent = findSet(s[x].parent);
return s[x].parent;
}
void unionSet(int x, int y){
int xroot, yroot;
xroot = findSet(x);
yroot = findSet(y);
if(s[x].rnk == s[y].rnk) {
s[xroot].rnk = s[xroot].rnk + 1;
s[yroot].parent = xroot;
}
else{
if(s[xroot].rnk > s[yroot].rnk) s[yroot].parent = xroot;
else s[xroot].parent = yroot;
}
}
int main()
{
in >> n >> m;
makeSet();
for(int i = 1; i <= m; i++){
in >> op >> x >> y;
e[i].src = x; e[i].dest = y;
if(op == 1) unionSet(x, y);
else {
x = findSet(x);
y = findSet(y);
if(x == y) out << "DA\n";
else out << "NU\n";
}
}
return 0;
}