瞌睡小源


私信TA

用户名:H2130823055

访问量:4819

签 名:

我が名はめぐみん、爆裂魔法を操りし者

等  级
排  名 45
经  验 11498
参赛次数 5
文章发表 76
年  龄 0
在职情况 学生
学  校 贺州学院
专  业

  自我简介:

看到要将一堆人联系起来,本蒟蒻第一时间想到的就是并查集,但是这里要我们输出的是最大群体。我们知道并查集路径压缩后每次查找这个群体的时候都会返回他们的“”祖宗“”,所以我们将群体的大小保存在“”祖宗“”里面,这样当两个群体合并的时候只需要将“”祖宗“”里面的数加到另外一个群体的‘’祖宗‘’就好了

AC代码:

#include<bits/stdc++.h>
using namespace std;
int flag[100005];
int sum[100005];
int find(int x)
{
	if(x!=flag[x])
	{
		flag[x]=find(flag[x]);
	}
	return flag[x];
}
void marge(int x,int y)
{
	int a=find(x);//找祖宗
	int b=find(y);//找祖宗
	if(a!=b)
	{
		flag[b]=a;//y的祖宗认x的祖宗为祖宗
		sum[a]+=sum[b];//将y的祖宗的人数加到x的祖宗里面
	}
}
int main()
{
	int n;
	while(~(scanf("%d",&n)))
	{
		for(int i=1;i<=100000;i++)
		{
			flag[i]=i;//一开始祖宗就是自己
			sum[i]=1;//一开始每个人都是为1的群体
		}
		while(n--)
		{
			int x,y;
			scanf("%d%d",&x,&y);
			marge(x,y);
		}
		int maxn=0;
		for(int i=1;i<100000;i++)//找最大的群体
		{
			maxn=max(maxn,sum[i]);
		}
		printf("%d\n",maxn);
	}
	return 0;
}


 

0.0分

0 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区