初始化:
for(int i=1;i<=n;i++)
a[i]=i;
每个节点的上级是自己。
关键模板:
int find(int x)
{
if(a[x]!=x) a[x]=find(a[x]);
return a[x];
}
我的理解:其中a[x]为x的上位节点,如果x的上位节点与x不相同,就继续顺着向上判断以上节点是否与x相同,当找到与x相同的节点时return a[x],意为将x并入其最上位节点,并且同时将x与其所在集合直接相连,方便再次查找(O(1))。
合并两个元素:
a[find(x)]=find(y);
意为令x的最上位节点连在y的最上位节点下面,即让x所在的集合成为y所在的集合的子集,从而实现x与y的合并。
如果两个元素在同一集合:
find(x)==find(y)
即判断两个元素的最上位节点是否相同。
-----------------------------------------------------------------------
我认为并查集顾名思义就是对多个元素、多个集合的合并以及对其中元素,子集的查寻。
其中最大的区别是由于每个元素经处理后都与根节点直接相连,所以查找某一元素所在集合或判断某两个元素是否在同一集合时所需时间大大减少,几乎都是O(1)。