前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >并查集

并查集

作者头像
Max超
发布2019-01-21 10:29:52
5510
发布2019-01-21 10:29:52
举报

性质 并查集算法(union_find sets)不支持分割一个集合,求连通子图、求最小生成树 用法 并查集是由一个数组pre[],和两个函数构成的,一个函数为find()函数,用于寻找跟节点,第二个函数是mix()用于合并路线的 pre[i]: i表示元素,pre[i]表示该元素i所在的集合中的父节点为pre[i]

这里写图片描述
这里写图片描述
代码语言:javascript
复制
int Find(int x)  
{  
    //查找根节点
    int r=x;  
    while(r!=pre[r])  
        r=pre[r];  
     //压缩路径
    int i=x,j;  
    while(pre[i]!=r)  
    {  
        j=pre[i];  
        pre[i]=r;  
        i=j;  
    }  
    return r;  
}  
代码语言:javascript
复制
void mix(int x,int y)  
{  
    int fx=Find(x),fy=Find(y);  
    if(fx!=fy)  
    {  
        pre[fy]=fx;  
    }  
}

hdu1232

代码语言:javascript
复制
#include<iostream>  
using namespace std;  

int  pre[1050];  
bool t[1050];               //t 用于标记独立块的根结点  

int Find(int x)  
{  
    int r=x;  
    while(r!=pre[r])  
        r=pre[r];  

    int i=x,j;  
    while(pre[i]!=r)  
    {  
        j=pre[i];  
        pre[i]=r;  
        i=j;  
    }  
    return r;  
}  

void mix(int x,int y)  
{  
    int fx=Find(x),fy=Find(y);  
    if(fx!=fy)  
    {  
        pre[fy]=fx;  
    }  
}   

int main()  
{  
    int N,M,a,b,i,j,ans;  
    while(scanf("%d%d",&N,&M)&&N)  
    {  
        for(i=1;i<=N;i++)          //初始化   
            pre[i]=i;  

        for(i=1;i<=M;i++)          //吸收并整理数据   
        {  
            scanf("%d%d",&a,&b);  
            mix(a,b);  
        }  


        memset(t,0,sizeof(t));  
        for(i=1;i<=N;i++)          //标记根结点  
        {  
            t[Find(i)]=1;  
        }  
        for(ans=0,i=1;i<=N;i++)  
            if(t[i])  
                ans++;  

        printf("%d\n",ans-1);  

    }  
    return 0;  
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年03月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档