首页 > 其他 > 详细

并查集--连通图相关

时间:2017-06-10 11:31:43      阅读:202      评论:0      收藏:0      [点我收藏+]

早上一番捣鼓,把以前丢失的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;
}

 

并查集--连通图相关

原文:http://www.cnblogs.com/hhbeast/p/6978120.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!