void separate(int x) { int a = find(x); if (a != x) { // has father for (int k = son[x]; k != -1; k = nextson[k].next) { father[nextson[k].to] = a; add_son(a, nextson[k].to); } if (nextson[son[father[x]]].to == x) { son[father[x]] = nextson[son[father[x]]].next; } else { for (int k = son[father[x]]; k != -1; k = nextson[k].next) { if (nextson[nextson[k].next].to == x) { nextson[k].next = nextson[nextson[k].next].next; break; } } } size[a]--; } else if (size[a] != 1) { // the root int sa = size[a]; a = nextson[son[x]].to; father[a] = a; for (int k = nextson[son[x]].next; k != -1; k = nextson[k].next) { father[nextson[k].to] = a; add_son(a, nextson[k].to); } size[a] = sa - 1; } // single father[x] = x; size[x] = 1; son[x] = -1; }
void merge(int x, int y) { int a = find(x), b = find(y); if (a != b) { father[a] = b; size[b] += size[a]; add_son(b, a); } }
void status_machine_imp::add(int state) { add_son(_root_status,state); }