不带权:
int f[];
void init(void)
{
for(int i=;i<=n;i++)
f[i]=i;
}
int fd(int x)
{
return f[x]==x?x:fd[x]=fd(f[x]);
}
int uion(int x,int y)
{
int fa=fd(x),fb=fd(y);
if(fa!=fb)f[fa]=fb;
}
带权:
int f[K],rl[K]; void init(void)
{
for(int i=;i<=n;i++)
f[i]=i;
}
int fd(int x)
{
if(f[x]==x) return x;
int fa=f[x];
f[x]=fd(f[x]);
rl[x]=(rl[x]+rl[fa])%;
return f[x];
}
void join(int x,int y,int op)
{
int fx=fd(x),fy=fd(y);
if(fx==fy)return;
f[fy]=fx;
rl[fy]=(op+rl[x]+rl[y])%;
}