并查集是一种神奇的算法,利用好可以解决许多高深的问题,尤其是其扩展应用,可以轻松秒掉一些难题。
pascal模板
基础并查集:
初始化
for i:=1 to n do father[i]:=i;
查找
function sf(x:longint):longint; begin if f[x]=x then exit(x) else f[x]:=sf(f[x]); exit(f[x]); end;
加权并查集:
初始化
for i:=1 to n do begin f[i]:=i; r[i]:=0; end;
查找同时处理关系(以2取模为例)
function sf(x:longint):longint; var fx:longint; begin if f[x]=x then exit(x) else begin fx:=sf(f[x]); r[x]:=(r[x]+r[f[x]]) mod 2; exit(fx); end; end;
并查集合并
procedure union(x,y,fx,fy,d:longint); begin f[fy]:=fx; r[fy]:=(2-r[y]+d+r[x]) mod 2; end;