Beispiel #1
0
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;
}
Beispiel #2
0
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);
    }
}
Beispiel #3
0
		void 
		status_machine_imp::add(int state)
		{
			add_son(_root_status,state);	
		}