Alex_McAvoy的博客

I'm not there,I'm not die.

并查集

【概述】

并查集(Union-Find Set)是一种用于分离集合操作的抽象数据类型,其处理的是集合(set)之间的关系,即:动态维护、处理集合元素之间复杂的关系。

当给出两个的元素的一个无序对(a,b)时,需要快速合并(union)a和b所在的集合,这其间需要反复查找(find)某元素的集合。

【并查集支持的操作】

1.设x表示一个对象,则有:

    make(x):建立一个新的集合,其仅有成员是x(也是集合代表)。由于各集合是分离的,要求x没有在其他集合出现过。

    union(x,y):将包含x、y的动态集合(Sx与Sy)合并为一个新的集合S。新集合S的集合代表是SxUSy的某个成员。

    find(x):返回一个指向包含x的集合的代表。

2.具体实现

    1)初始化

for(int i=1;i<=n;i++)//因为每个元素属于单独的一个集合,所以每个元素以自己作为自己的根节点
	father[i]=i;

    2)寻找根节点编号并压缩路径

int Find(int x)//非递归实现
{
    while(father[x]!=x)
        x=father[x];
    return x;
}

int Find(int x)//递归实现—未优化版本
{
    if(father[x]!=x)
        return Find(father[x]);
    else
        return father[x];
}

int Find(int x)//递归实现—优化版本
{
    if(father[x]!=x)
        father[x]=Find(father[x]);//路径压缩,优化核心
    return father[x];
}

    3)合并两个集合

void Union(int x,int y)
{
    x=Find(x);
    y=Find(y);
    father[y]=x;
}

    4)判断元素是否属于同一集合

bool judge(int x,int y)
{
    x=Find(x);
    y=Find(y);
    if(x==y)
        return true;
    else 
        return false;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011815404/article/details/80316246
上一篇最小生成树
下一篇T1327 黑白棋子的移动(#Ⅱ- 7)
想对作者说点什么? 我来说一句

acm的数据结构内容

2010年04月23日 408KB 下载

并查集模板

2018年06月24日 1KB 下载

朱全民-并查集ppt

2009年07月25日 103KB 下载

并查集初步

2012年12月01日 386KB 下载

没有更多推荐了,返回首页

关闭
关闭