#include "graph.hpp" #include class ClusterTree { private: std::vector p; std::vector o; public: std::vector c; ClusterTree(unsigned n) : p(n, -1), o(n, 1), c(n, 0) { c[0] = n; } unsigned findroot(unsigned i) { if (p[i] < 0) return i; else return p[i] = this->findroot(p[i]); } void join(unsigned i, unsigned j) { c[o[i] - 1]--; c[o[j] - 1]--; if (o[i] < o[j]) { p[i] = j; o[j] += o[i]; c[o[j] - 1]++; } else { p[j] = i; o[i] += o[j]; c[o[i] - 1]++; } } void add_bond(const graph::edge& b) { unsigned i = this->findroot(b.v[0]); unsigned j = this->findroot(b.v[1]); if (i != j) { this->join(i, j); } } bool same_component(unsigned v0, unsigned v1) { unsigned i = this->findroot(v0); unsigned j = this->findroot(v1); return i == j; } };