とりあえず、部分永続Disjoint Setについておさらいしてみる。
まず、部分永続でないDisjoint Setは以下の操作ができる
union x,y …xの属するグループとyの属するグループを融合させる
find(x) … xの属するグループを返す
場合によっては以下の操作が出来る
same(x,y) …xの属するグループとyの属するグループが同じかどうか判定する
size(x) … xと同じグループに属する要素数を返す
雑に実装するとこんな感じ
DIM PARENT[1000],SIZE[1000]
DEF INIT N
VAR I%
FOR I%=0 TO N-1
PARENT[I%]=I%
SIZE[I%]=1
NEXT I%
END
DEF UNION X,Y
WHILE X!= PARENT[X]
X=PARENT[PARENT[X]]
PARENT[X]=X
WEND
WHILE Y!= PARENT[Y]
Y=PARENT[PARENT[Y]]
PARENT[Y]=Y
WEND
IF X!=Y THEN
IF SIZE[X]>SIZE[Y] THEN
PARENT[Y]=X
INC SIZE[X],SIZE[Y]
ELSE
PARENT[X]=Y
INC SIZE[Y],SIZE[X]
ENDIF
ENDIF
END
DEF FIND(X)
WHILE X!= PARENT[X]
X=PARENT[PARENT[X]]
PARENT[X]=X
WEND
RETURN X
END