并查集

并查集

并查集主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:
合并(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";
    }
} 
全部评论

相关推荐

代码飞升_不回私信人...:别这样贬低自己,降低预期,放平心态,跟昨天的自己比。做好自己,反而会效率更高心态更好,加油兄弟
点赞 评论 收藏
分享
程序员牛肉:你这其实一点都没包装,标准的流水线产品。 实习现在不一定能解决你的问题,你太浮躁了。你看了多少源码?看了多少技术博客?真的没必要这么浮躁的着急找实习,沉下心来学习
投递实习岗位前的准备
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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