并查集

让人想犯罪 __ 提交于 2020-01-23 16:52:37

一,
并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题,常常在使用中以森林来表示。

二,主要操作
1.初始化
把每个点所在集合初始化为其自身。
通常来说,这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(N)。
2.查找
查找元素所在的集合,即根节点。
3.合并
将两个元素所在的集合合并为一个集合。
通常来说,合并之前,应先判断两个元素是否属于同一集合,这可用上面的“查找”操作实现。

3.例题:朋友圈
有n个人,编号1-n。
现在有一个舞会,在舞会上,大家会相互介绍自己的朋友。
即: 如果a认识b,b认识c。那么在舞会上,a就会通过b认识到c。
现在,给出m个关系
每个关系描述:
a b
表示 编号为a和编号为b的人是朋友关系。
最后问,会有多少个朋友圈。

代码实现

#include<stdio.h>
int unionsearch(int root);
int db[5000000]//每个朋友圈的代表,如db[2]=3指编号为2的人朋友圈的代表是编号为3的人
int main()
{
    int n, m, pyq, i, start, end, root1, root2,sum=0;
    while(scanf("%d", &n)!=EOF)
    {
        scanf("%d", &m);
        for(i = 1; i <= n; i++)
            db[i] = i;//初始化每个人的朋友圈只有自己一人
        while(m--)
        {
            sum=0;
            scanf("%d%d", &start, &end);
            root1 = unionsearch(start);
            root2 = unionsearch(end)//查找代表
            if(root1 != root2)
            {
                db[root1] = root2;
            }
        }
       for(int i=1;i<=n;i++)
       {
           if(db[i]==i)
           {
               sum++;
           }
       }
       printf("%d\n",sum);
    }
    return 0;
}
int unionsearch(int root)//让一个朋友圈的代表是同一人,返回代表
{
   while(root!=db[root])
   {
      root=db[root];
   }

    return root;
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!