Pagini recente » Cod sursa (job #868697) | Cod sursa (job #2155312) | Cod sursa (job #330019) | Cod sursa (job #248595) | Cod sursa (job #1221456)
#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 *size;
};
WQUPC::WQUPC(int n) :
id(new int[n]),
size(new int[n])
{
for (int i = 0; i < n; ++i) {
id[i] = i;
size[i] = 1;
}
}
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);
// Apply weighting.
if (size[rootP] < size[rootQ]) {
id[rootP] = rootQ;
size[rootQ] += size[rootP];
} else {
id[rootQ] = rootP;
size[rootP] += size[rootQ];
}
}
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;
int p, q;
in >> p >> q;
--p;
--q;
if (code == 1)
disjoint->connect(p, q);
else
disjoint->areConnected(p, q) ? out << "DA\n" :
out << "NU\n";
}
delete disjoint;
return 0;
}