并查集算法理解
并查集主要就是解决判断两个点两个物体是否有关系,如在最小生成树kruskal算法中是为了判断两个村庄是否已经连通,在练习中有判断学生的宗教信仰,和某个人有关系的其他人等等之类的问题。
对于并查集的实现是先初始化f[]数组,在不知道关系的情况下每个点的父亲祖先都是自己本身,当两个点有关系时,改变f[]数组值,根据啊哈算法上介绍是根据靠左原则存储父辈,将有关系的点都练习起来他们都有一个共同的祖先即根节点,在判断两个点是否有关系时,只需判断两点的根节点是否相同,相同则说明两点有关系;并查集也可查找共有几个组织(有几个点的根节点为自己本身则说明有几个组织)。
初始化:
for(i=1;i<=n;i++)
f[i]=i;
模板:
int getf(int i)
{
if(f[i]==i)
return i;
else
{
f[i]=getf(f[i]);
return f[i];
}
}
void merge(int u,int v)
{
int t1,t2;
t1=getf(u);
t2=getf(v);
if(t1!=t2)
f[t2]=t1;
}