Pagini recente » Cod sursa (job #2784997) | Cod sursa (job #2949756) | Cod sursa (job #2304877) | Cod sursa (job #1219138) | Cod sursa (job #2986205)
#include <iostream>
#include <fstream>
using namespace std;
const int NMAX = 100005;
int n, m, x, y, code, parent[NMAX], nodeRank[NMAX];
/// 1. Reuniuena dupa rang:
/// > Declar global un vector rank[]
/// > Determin radacinile celor doua noduri, parametri ai subprogramului de reuniune
/// > Radacina al carei rang este mai mare va deveni radacina ambilor arbori
/// * In cazul in care ambele radacini au acelasi rang, atunci va fi aleasa aleatoriu una
/// din cele doua radacina drept radacina a ambilor arbori, iar rangul acesteia va fi incrementat
/// 2. Comprimarea drumului:
/// > Pentru fiecare nod parcurs, vom retine intr-o variabila radacina arborelui
/// din care fac parte aceste noduri, iar la finalizarea parcurgerii arborelui,
/// prin gasirea radacinii acestuia, vom stabili drept parinte al tuturor nodurilor
/// parcurse nodul radacina salvat in variabila
/// we need to find the root of a tree
int findRoot(int node) {
if (!parent[node]) {
return node;
}
parent[node] = findRoot(parent[node]);
return parent[node];
}
/* Old function
int findRoot(int node) {
if (!parent[node]) {
return node;
}
return findRoot(parent[node]);
}
*/
/// we need to unite two trees
void uniteTrees(int node1, int node2) {
int node1Root = findRoot(node1), node2Root = findRoot(node2);
if (nodeRank[node1Root] > nodeRank[node2Root]) {
parent[node2Root] = node1Root;
} else {
parent[node1Root] = node2Root;
if (nodeRank[node1Root] == nodeRank[node2Root]) {
++nodeRank[node2Root];
}
}
}
/* Old function
void uniteTrees(int node1, int node2) {
int node1Root = findRoot(node1), node2Root = findRoot(node2);
cout << "x: " << node1 << endl;
cout << "y: " << node2 << endl;
cout << "Root of x: " << node1Root << endl;
cout << "Root of y: " << node2Root << endl;
if (node1Root != node2Root) {
parent[node1Root] = node2Root;
}
}
*/
int main() {
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
fin >> n >> m;
for (int i = 0; i < m; ++i) {
fin >> code >> x >> y;
if (code == 1) {
//parent[x] = y;
uniteTrees(x, y);
} else {
if (findRoot(x) == findRoot(y)) {
fout << "DA\n";
} else {
fout << "NU\n";
}
}
/*
for (int j = 1; j <= n; ++j) {
cout << parent[j] << ' ';
}
cout << endl << endl;
*/
}
/*
for (int i = 1; i <= m; ++i) {
fin >> x >> y;
parent[x] = y;
}
*/
for (int i = 1; i <= n; ++i) {
cout << "Root of node " << i << ": " << findRoot(i) << endl;
}
return 0;
}