Pagini recente » Cod sursa (job #583783) | Cod sursa (job #1456430) | Cod sursa (job #2047202) | Cod sursa (job #879377) | Cod sursa (job #1221447)
#include <fstream>
#include <cassert>
class WQUPC
{
public:
WQUPC(int n);
~WQUPC();
bool areConnected(int p, int q);
void connect(int p, int q);
private:
int root(int i);
int *id;
int *rank;
};
WQUPC::WQUPC(int n) :
id(new int[n]),
rank(new int[n])
{
for (int i = 0; i < n; ++i) {
id[i] = i;
rank[i] = 0;
}
}
WQUPC::~WQUPC()
{
// nothing to do
}
int WQUPC::root(int i)
{
// Apply path compression.
if (i != id[i])
id[i] = root(id[i]);
return id[i];
}
bool WQUPC::areConnected(int p, int q)
{
return root(p) == root(q);
}
void WQUPC::connect(int p, int q)
{
int rootP = root(p);
int rootQ = root(q);
if (rootP == rootQ)
return;
// Apply weighting.
if (rank[rootP] < rank[rootQ]) {
id[rootP] = rootQ;
} else if (rank[rootP] > rank[rootQ]) {
id[rootQ] = rootP;
} else {
id[rootQ] = rootP;
rank[rootP] += 1;
}
}
int main()
{
std::ifstream in("disjoint.in");
std::ofstream out("disjoint.out");
int N, M;
in >> N >> M;
WQUPC *disjoint = new WQUPC(N);
for (int i = 0; i < M; ++i) {
int code;
in >> code;
assert(code == 1 || code == 2);
int p, q;
in >> p >> q;
--p;
--q;
assert(0 <= p < N && 0 <= q < N);
if (code == 1)
disjoint->connect(p, q);
else
disjoint->areConnected(p, q) ? out << "DA" << std::endl :
out << "NU" << std::endl;
}
delete disjoint;
return 0;
}