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