Codeup:More is better

题目链接

题意:

​ 有10000000个元素,给定n对数字A,B,将A,B所在的集合合并(一开始每个元素所在的集合只有它自己),选择一个元素所在的集合,求这个集合的元素个数最多为多少?

思路:

​ 典型的并查集题型,但除了要用到基础的合并外,还多了求集合大小和最大的集合大小的操作,这是需要自己去思考并解决的,首先如果把一千万个元素都扫一遍,显然会超时。那么既然大多数的元素都没有被合并,那么只需要管出现了的元素就行了,我用了set来记录出现过的元素。而至于元素的大小,只需要在扫的时候将同一集合的个数++就行了。一趟下来的时间复杂度为O(nlog2(n))。

100分AC代码:
#include <bits/stdc++.h>
using namespace std;
int m,n=100000;
int f[100005];
int find(int x){
    if(f[x]==x)return x;
    return f[x]=find(f[x]);
}
void uni(int x,int y){
    int fx=find(x);
    int fy=find(y);
    f[fx]=fy;
}
int main() {
    while(cin>>m){
        int ans=1;//注意ans要为1
        map<int,int> a;
        set<int> b;
        memset(f,0,sizeof(f));
        for(int i=1;i<=n;i++)f[i]=i;
        for(int i=1;i<=m;i++){
            int x,y;
            cin>>x>>y;
            uni(x,y);
            b.insert(x);
            b.insert(y);
        }
        for(set<int>::iterator it=b.begin();it!=b.end();it++){
            a[find(*it)]++;
            ans=max(ans,a[find(*it)]);
        }
        cout<<ans<<endl;
    }
    return 0;
}

大功告成!

原文链接: https://www.cnblogs.com/returnG/p/13149125.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    Codeup:More is better

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/355680

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午10:28
下一篇 2023年3月2日 上午10:28

相关推荐