Pagini recente » Cod sursa (job #1417611) | Cod sursa (job #67001) | Cod sursa (job #1624363) | Borderou de evaluare (job #1569059) | Cod sursa (job #2706252)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("disjoint.in");
ofstream cout("disjoint.out");
struct Node
{
int dat;
int rnk;
Node *par;
} v[100005];
void makeSet(int dat)
{
v[dat].dat=dat;
v[dat].rnk=0;
v[dat].par=&v[dat];
}
Node* findPar(Node *node)
{
if(node->par == node)
return node;
Node *par = findPar(node->par);
node->par = par;
return par;
}
int findPar(int dat)
{
return findPar(&v[dat])->par->dat;
}
void unionSet(Node *node1, Node *node2)
{
Node *par1 = findPar(node1);
Node *par2 = findPar(node2);
if(par1 == par2)
return;
if(par1->rnk >= par2->rnk)
{
par2->par = par1;
if(par1->rnk == par2->rnk)
++par1->rnk;
}
else
par1->par = par2;
}
void unionSet(int node1, int node2)
{
unionSet(&v[node1], &v[node2]);
}
int main()
{
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; ++i)
makeSet(i);
for(int i = 1; i <= m; ++i)
{
int a, b, c;
cin >> a >> b >> c;
if(a == 1)
unionSet(b, c);
else
{
if(findPar(b) == findPar(c))
cout << "DA\n";
else
cout << "NU\n";
}
}
return 0;
}