void UnionFind<NODE_NUM>::createUnion(int node1, int node2){ int root1 = _root(node1); int root2 = _root(node2); if (root1 == root2) return; if (_root_size[root1] < _root_size[root2]){ _node_array[root1] = root2; _root_size[root2] += _root_size[root1]; } else { _node_array[root2] = root1; _root_size[root1] += _root_size[root2]; } }
void soctree_delete(soctree_t *p) { _node_t *root = _root(p); if (root) { _delete_recursive(root); free(root); root = 0; } free(p); }
int soctree_insert(soctree_t *p, int w) { _node_t *root = _root(p); if (!root) { return -1; } if (0 > w) { return -1; } if (0xffffff < w) { return -1; } _insert(root, 0xffffff & w, 0); return 0; }
int soctree_find(soctree_t *p, int w) { _node_t *root = _root(p); if (!root) { goto fail; } if (0 > w) { goto fail; } if (0xffffff < w) { goto fail; } _node_t *found = _find(root, 0xffffff & w, 0); if (!found) { goto fail; } return 0; fail: return -1; }
bool UnionFind<NODE_NUM>::connected(int node1, int node2){ if (_root(node1) == _root(node2)) return true; else return false; }
int soctree_size(soctree_t *p) { _node_t *root = _root(p); return root ? _weight(root) : -1; }
RootPanel_p Hook::root() const { return _root(); }