并查集(正经
并查集是一种支持动态 link 的,能够快速判断两元素是否处于同一集合的数据结构。
(如果需要 cut,请出门右转 LCT)
那么其基本操作就包括:
-
连边。在两个点之间连一条边,使得两个点所在的两个集合合并为一个集合。
-
查询。查询两个点是否处在同一个集合中。
这也是普通并查集的所有操作了。
普通并查集
找根
当连边的时候,如果两个点本来就在一个集合里,是不需要再连边的。因此整个并查集的形态便是森林。
一般而言,树都是有根的,那么确定两个点分别属于哪个集合的时候,就可以找到并判断它们的根是否相等。
而连边的时候,也仅需要将两个根连接起来,因此找根是并查集的核心操作。
既然要找根,那么也就需要知道点与点之间的父(子)关系(确定父关系足矣)。
初始的时候,每个点各自为营,那么其父亲就是他们自己(我当我的爹)。
for(int i=1;i<=n;i++)fa[i]=i;
每次操作的时候,不管是连边还是查询,都需要先找到两个点所在树的根。
一个很朴素的想法就是,既然知道父关系,那么就根据父关系一路往上跳。
根据初始化,直到当前节点的父亲为自己,就是找到根了。
代码如下:
int find(int s)
{
if(s==fa[s])return s;
return find(fa[s]);
}
找到根之后,这两个操作也就很容易实现了:
for(int i=1;i<=m;i++)
{
op=re();u=re();v=re();
int r1=find(u),r2=find(v);
if(op==1)fa[r1]=fa[r2];
else puts(r1==r2?"Y":"N");
}
标签:连边,冰茶,int,查集,一种,饮料,集合,两个
From: https://www.cnblogs.com/Zvelig1205/p/16978021.html