并查集--连通图相关

Posted FlyingCode

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集--连通图相关相关的知识,希望对你有一定的参考价值。

早上一番捣鼓,把以前丢失的onenote笔记找出来一部分.

看到并查集,大二做的笔记,现在已经毫无印象了

记得当时看的时候挺费劲,云里雾里的

现在再看一遍竟然毫无压力,一次读懂

其实确实挺简单的,没有那么高深.可能当时玩acm的时候太没自信了,看啥都难...

核心思想是用一个节点代表一块连通分支

可以通过路径压缩来减少以后查找的时间

非路径压缩递归写法:

int fFind(int i)
{
        if(pre[i]!=i) pre[i]=fFind(pre[i]);
        return pre[i];
}

路径压缩非递归写法:

int fFind(int i)
{
    int roooot=i;
    while(pre[roooot]!=roooot)
                roooot=pre[roooot];//寻根
    int tmp;
    while(pre[i]!=roooot)
        {
                tmp=pre[i];
                pre[i]=roooot;
                i=tmp;
        }//路径压缩
    return pre[i];
 }

适用于代码行数强迫症的一行写法:

int find(int x) 
{
    return p[x]==x?x:p[x]=find(p[x]);
}

两个相关并查集交融的mix函数:

mix函数
void mix(int a,int b)
{
        int i=fFind(a),j=fFind(b);
        if(i!=j)
                pre[i]=j;
}

 

以上是关于并查集--连通图相关的主要内容,如果未能解决你的问题,请参考以下文章

[BZOJ3237][AHOI2013]连通图(分治并查集)

并查集-判断图的连通

hdu 1213 How Many Tables(并查集求无向图有几个连通分量)

判断图连通的三种方法——dfs,bfs,并查集

并查集解决图论问题(连通性及有无圈存在)

BZOJ 1854: [Scoi2010]游戏 [连通分量 | 并查集 | 二分图匹配]