栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

并查集问题详解(亲戚问题变种)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

并查集问题详解(亲戚问题变种)

什么交并查集勒

我们采用官方解释

并查集:并查集 (英文:Disjoint-set data structure,直译为不交集数据结构)是一种 数据结构 ,用于处理一些 不交集 (Disjoint sets,一系列没有重复元素的集合)的合并及查询问题。. 并查集支持如下操作:. 查询:查询某个元素属于哪个集合,通常是返回集合内的一个"代表元素"。. 这个操作是为了判断两个元素是否在同一个集合之中。. 合并:将两个集合合并为一个。

好吧,确实有点唐突

光从文字无法理解

这里博主通过牛客上的一道题

来描绘并查集的核心问题

 题目大意解就是找每个之间是否有联系

解题代码如下

#include
#include
using namespace std;
int vis[(int)1e5+3];
int sum[(int)1e5+3];//vis为找初消息者,sum为存交际圈
int find(int k)
{
    return k==vis[k]?k:vis[k]=find(vis[k]);
}
int main()
{
    int n,m,a,b;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        vis[i]=i;
        sum[i]=1;
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&a,&b);
        if(find(a)!=find(b))//初消息者不相同
        {
            sum[find(a)]+=sum[find(b)];//关系和
            vis[find(b)]=find(a);//b的祖宗改为a的祖宗
        }
    }
    int mi=n+3,mx=0;
    for(int i=1;i<=n;i++)
    {
        if(vis[find(i)]==i)
        {
            mi = min(mi,sum[i]);
            mx = max(mx,sum[i]);
        }
    }
    if( n==mx)
        cout<<"WOW";
    else
        cout< 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/663896.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号