原题链接:肺炎大作战
这个题本质就是求连通块大小,我一开始想的是DFS染色,但是想了下N太大了这样做绝对会TLE,所以换了个思路,用并查集。但是普通并查集只能查找两个点是否连通,并不能查找连通块的大小,所以得加个数组记录当前连通块的大小…然后为了节约时间,可以直接在连边的时候对比出最大的连通块的点的数量…
// 这个题A,B的范围非常大,直接开数组甚至连编译都过不了,我是投机取巧开的比较小,但是过了..建议用离散化的方式做Orz
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 100011;
struct unionFind {
int bin[N], sz[N], mx;
unionFind () {
mx = 0;
for (int i = 0; i < N; i++) bin[i] = i, sz[i] = 1;
}
int anc(int x) {
if (x != bin[x]) bin[x] = anc(bin[x]);
return bin[x];
}
void uni(int x, int y) {
int a = anc(x), b = anc(y);
if (a != b) {
sz[b] += sz[a];
mx = max(mx, sz[b]);
bin[a] = b;
}
}
bool ask(int x, int y) {
return anc(x) == anc(y);
}
int getmax() {
return mx;
}
};
int main() {
int n, x, y;
while (scanf("%d", &n) != EOF) {
unionFind uf;
for (int i = 1; i <= n; i++) scanf("%d%d", &x, &y), uf.uni(x, y);
printf("%d\n", uf.getmax());
}
return 0;
}
9.9 分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复