summaryrefslogtreecommitdiff
path: root/lib/include/clusters.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/include/clusters.hpp')
-rw-r--r--lib/include/clusters.hpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/lib/include/clusters.hpp b/lib/include/clusters.hpp
new file mode 100644
index 0000000..4cc9073
--- /dev/null
+++ b/lib/include/clusters.hpp
@@ -0,0 +1,52 @@
+
+#include <vector>
+#include "graph.hpp"
+
+class ClusterTree {
+private:
+ std::vector<signed> p;
+ std::vector<unsigned> o;
+
+public:
+ std::vector<unsigned> 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;
+ }
+};