上周六的时候吧,刷了几道并查集的题,学到了一些新东西,特此来记录下来方便以后复习
1.found函数新写法
以前我写并查集的found函数长这个样子:

int found(int x)
{
    if(f[x]==x)return x;
    return f[x]=found(f[x]);
}

这次在刷题的过程中看到了一种新鲜的写法如下:

int found(int x)
{
    int r=x;
    while(f[r]!=r)
    {
        r=f[r];
    }
    int j;
    while(x!=r)
    {
       j=f[x];
       f[x]=r;
       x=j;
     }
}

(收藏下来涨见识)
2.关于并查集和树的联系
无向图
树最重要的一个特点便是没有环,如何证明其没有环呢,就是要保证你每次合并的两个数的祖先都是不一样的。除此之外,比较容易忽略的一点便是不能有空树,即所有元素的祖先必须只能有一个
图片说明

图片说明
有向图
有向图除了要满足以上两个条件外,还有一点也十分重要,就是要保证方向。可能他们的祖先确实是一个,但有向图多了方向这个变量之后,可能造成其有两个根节点,所以需要加一个入度的判断
图片说明

图片说明
其中,我的s变量里存的是所有有入度的节点,如果最后我所有的节点和有入度的节点数之间差1,则代表其是树,程序正确。
(树的根节点只有出度没有入度)

做完题之后深刻感觉到自己涨知识了哈哈哈