Pagini recente » Clasament savedemdecesunteminstare | Arhiva de probleme | Monitorul de evaluare | Istoria paginii runda/primul | Cod sursa (job #996924)
Cod sursa(job #996924)
#include <fstream>
struct Node
{
int parent;
int rank;
Node() : parent(), rank() {}
Node(int a) : parent(a), rank(0) {}
};
int find(Node *A, int x);
void unions(Node *A, int x, int y);
int main()
{
std::ifstream in("disjoint.in");
std::ofstream out("disjoint.out");
int nV, nM, a, b, c, x, y;
in >> nV >> nM;
Node *Arr = new Node[nV + 1];
for(int i = 1; i <= nV; i++)
Arr[i] = Node(i);
for(int i = 0; i < nM; i++)
{
in >> a >> b >> c;
if(a == 1)
unions(Arr, b, c);
else
{
x = find(Arr, b);
y = find(Arr, c);
if(x == y) out << "DA\n";
else out << "NU\n";
}
}
return 0;
}
int find(Node *A, int x)
{
if(x != A[x].parent)
A[x].parent = find(A, A[x].parent);
return A[x].parent;
}
void unions(Node *A, int x, int y)
{
int a = find(A, x), b = find(A, y);
if(a == b) return;
if(A[a].rank == A[b].rank)
{
A[a].rank++;
A[b].parent = a;
}
else if(A[a].rank < A[b].rank)
A[a].parent = b;
else A[b].parent = a;
}