Pagini recente » Cod sursa (job #786462) | Cod sursa (job #2920581) | Cod sursa (job #2318185) | Cod sursa (job #190327) | Cod sursa (job #1212608)
#include <fstream>
using namespace std;
void solve();
void makeSet(int node);
int find(int node);
void join(int x, int y);
struct node
{
int parent;
int rank;
};
int N;
struct node set[100005];
int main()
{
solve();
return 0;
}
void solve()
{
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int m,o,x,y;
fin>>N>>m;
for(int i=1;i<=N;i++)
{
makeSet(i);
}
for(int i=0;i<m;i++)
{
fin>>o>>x>>y;
if(o == 1)
{
join(x,y);
}
else
{
fout<<(find(x) == find(y) ? "DA\n" : "NU\n");
}
}
}
void makeSet(int node)
{
set[node].parent = node;
set[node].rank = 0;
}
int find(int node)
{
if(set[node].parent == node)
{
return node;
}
else
{
set[node].parent = find(set[node].parent);
return set[node].parent;
}
}
void join(int x, int y)
{
int rootX = find(x);
int rootY = find(y);
if(rootX == rootY)
{
return;
}
if(set[rootX].rank < set[rootY].rank)
{
set[rootX].parent = rootY;
}
else if(set[rootX].rank > set[rootY].rank)
{
set[rootY].parent = rootX;
}
else
{
set[rootX].parent = rootY;
set[rootY].rank += 1;
}
}