原题链接:肺炎大作战
看到要将一堆人联系起来,本蒟蒻第一时间想到的就是并查集,但是这里要我们输出的是最大群体。我们知道并查集路径压缩后每次查找这个群体的时候都会返回他们的“”祖宗“”,所以我们将群体的大小保存在“”祖宗“”里面,这样当两个群体合并的时候只需要将“”祖宗“”里面的数加到另外一个群体的‘’祖宗‘’就好了
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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复