并查集

并查集

并查集主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:
合并(Union):把两个不相交的集合合并为一个集合。
查询(Find):查询两个元素是否在同一个集合中。

初始化:

fa[i]=i;

Find:

无压缩

int Find(int x) {
    if(fa[x]==x) return x;
    else return Find(fa[x]);
}

压缩

int Find(int x) {
//    if(x!=fa[x]) fa[x]=Find(fa[x]);
//    return fa[x];
    return x==fa[x] ? x : (fa[x]=Find(fa[x]));//简写
}

Union:

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

例(洛谷P1551):

https://www.luogu.com.cn/problem/P1551

#include<bits/stdc++.h>
using namespace std;
int fa[5005];
int Find(int x) {
//    if(x!=fa[x]) fa[x]=Find(fa[x]);
//    return fa[x];
    return x==fa[x] ? x : (fa[x]=Find(fa[x]));
}
void Union(int x,int y) {
    fa[Find(x)]=Find(y);
}
int main() {
    int n,m,p;
    cin>>n>>m>>p;
    for(int i=1;i<=n;++i) fa[i]=i;
    for(int i=1;i<=m;++i) {
        int x,y;
        cin>>x>>y;
        Union(x,y);
    }
    for(int i=1;i<=p;++i) {
        int x,y;
        cin>>x>>y;
        if(Find(x)==Find(y)) {
            cout<<"Yes\n";
        }
        else cout<<"No\n";
    }
} 
全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 18:03
点赞 评论 收藏
分享
来个厂收我吧:首先,市场侧求职我不是很懂。 但是,如果hr把这份简历给我,我会觉得求职人不适合做产品经理。 问题点: 1,简历的字体格式不统一,排版不尽如人意 2,重点不突出,建议参考star法则写个人经历 3,印尼官方货币名称为印度尼西亚卢比(IDR),且GMV690000印尼盾换算为305人民币,总成交额不高。 4,右上角的意向职位在发给其他公司时记得删除。 5,你所有的经历都是新媒体运营,但是你要投市场营销岗位,jd和简历不匹配,建议用AI+提示词,参照多个jd改一下经历内容。 修改建议: 1,统一字体(中文:思源黑体或微软雅黑,英文数字:time new romans),在word中通过表格进行排版(b站学) 2,校招个人经历权重:实习经历=创业经历(大创另算)>项目经历>实训经历>校园经历 3,请将项目经历时间顺序改为倒序,最新的放最上方。 4,求职方向不同,简历文字描述侧重点也需要不同。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 11:27
明天又是董事长面,啥时候是个头啊
在太阳里长大的人:公司就仨人吧😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务