zoukankan      html  css  js  c++  java
  • 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;
    }
    

    大功告成!

  • 相关阅读:
    struts2 批量上传.
    jsoup html解析器 实现对博客园博文标题链接抓取
    赶鸭子上架的cdq分治
    RE:从零开始的莫比乌斯反演
    我永远无法学会的dp
    gym 101915
    2017-2018 ACM-ICPC Latin American Regional Programming Contest GYM101889
    网络流24T
    re:从零开始的数位dp
    Codeforces Round 504
  • 原文地址:https://www.cnblogs.com/returnG/p/13149125.html
Copyright © 2011-2022 走看看