这个题本质就是求连通块大小,我一开始想的是DFS染色,但是想了下N太大了这样做绝对会TLE,所以换了个思路,用并查集。但是普通并查集只能查找两个点是否连通,并不能查找连通块的大小,所以得加个数组记录当前连通块的大小…然后为了节约时间,可以直接在连边的时候对比出最大的连通块的点的数量…
// 这个题A,B的范围非常大,直接开数组甚至连编译都过不了,我是投机取巧开的比较小,但是过了..建议用离散化的方式做Orz

  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4. const int N = 100011;
  5. struct unionFind {
  6. int bin[N], sz[N], mx;
  7. unionFind () {
  8. mx = 0;
  9. for (int i = 0; i < N; i++) bin[i] = i, sz[i] = 1;
  10. }
  11. int anc(int x) {
  12. if (x != bin[x]) bin[x] = anc(bin[x]);
  13. return bin[x];
  14. }
  15. void uni(int x, int y) {
  16. int a = anc(x), b = anc(y);
  17. if (a != b) {
  18. sz[b] += sz[a];
  19. mx = max(mx, sz[b]);
  20. bin[a] = b;
  21. }
  22. }
  23. bool ask(int x, int y) {
  24. return anc(x) == anc(y);
  25. }
  26. int getmax() {
  27. return mx;
  28. }
  29. };
  30. int main() {
  31. int n, x, y;
  32. while (scanf("%d", &n) != EOF) {
  33. unionFind uf;
  34. for (int i = 1; i <= n; i++) scanf("%d%d", &x, &y), uf.uni(x, y);
  35. printf("%d\n", uf.getmax());
  36. }
  37. return 0;
  38. }
点赞(0)
 

9.9 分

1 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论