并查集模板

      并查集是一种神奇的算法,利用好可以解决许多高深的问题,尤其是其扩展应用,可以轻松秒掉一些难题。

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;

 

你可能感兴趣的:(并查集)