并查集使用(2):more is better

题目网址:more is better

题目分析:这个题目大致是说,有10000000个朋友,他们之中有N对好朋友,且朋友之间具有传递性,再给出N对朋友关系之后,找出最多的人数的集合,并输出最大的人数!其实就是之前在我的博客并查集梳理(1)里面merge函数中添加一步,为每个集合统计集合元素的数目,事先为每一个元素定义一个sum数组,初始化都是1(表示根节点自身)每一次需要合并都需要sum想加!最后找出最大的元素集合输出sum即可;

#include
using namespace std;
int parent[10000001];
int sum[10000001];
int findroot(int x)
{
	if (parent[x] != x)
		parent[x] = findroot(parent[x]);//当前节点的根节点设置成查找返回的根节点的编号
	return parent[x];
}
void merge(int a, int b)/*合并a和b*/
{
	a = findroot(a);
	b= findroot(b);
	if (a != b)
	{
		parent[a] = b;//a变成子树,b为新树的根
	    sum[b] += sum[a];/*合并两集时,将成为子树的树的根节点上保存的该集合元素的个数加入新合并的树的树根*/
	}
}
int main()
{
	int n;
	while (cin >> n)
	{
		for (int i = 1; i <= 10000000; i++)
		{//初始化不能少,初始的时候每个节点都是孤立的集合,即所在集合只有一个节点,本身即为根节点
			parent[i] = i;
			sum[i] = 1;
		}
		int maxn = -1;//用来统计最大的下标,这样就不用再最后找最大的sum时,从1扫描到1000000
		while (n--)
		{
			int a, b;
			cin >> a >> b;
			if (a > maxn)
				maxn = a;
			else if (b > maxn)
				maxn = b;
			merge(a, b);
		}
		int ans =1;//每一个集合初始化最小为1,所以我设置为1
		for (int i = 1; i <= maxn; i++)
		{
			if (parent[i] == i&&sum[i]>ans)
				ans=sum[i];
		}
		cout << ans << endl;
	}
	return 0;
}



你可能感兴趣的:(并查集)