并查集可以理解为集合
目前可以实现的功能有,判断两个点是否在同一个集合中,如果不在同一个集合中,把两个点的集合合并成一个。
主要应用于判断是否有环,以及最小生成树中。
代码与思路本身难度不高。
每次都寻找该点的树根,判断两点的树根是否相等即可。
附核心代码:
int p[1005];
//p[x] == x ? 判断是否该点就是树根,注意是双等号
int Find(int x)
{
return (x == p[x] )? x : p[x] = Find(p[x]);
}
void init()
{
for(int i = 1; i <= n; i ++)
{
p[i] = i;
}
int main()
{
scanf("%d%d",&a,&b);
pa = Find(a);
pb = Find(b);
if(pa!= pb)
{
//让两个不同集合的根相互连接
p[pb] = pa;
}
else
{
flag = true;//有环
break;
}
}
}