并查集模板

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

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;

 

posted @ 2013-11-19 17:32  forever97  阅读(254)  评论(0编辑  收藏  举报