PAT(甲级)1118 Birds in Forest (25point(s))

迈不过友情╰ 2024-05-08 06:02 180阅读 0赞
题目

题目链接

思路

题目大意:在同一张照片里的鸟属于一个树,所以用并查集就可以做了;
至于鸟的数量,可以通过set去重存储;

代码
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <set>
  5. using namespace std;
  6. const int maxn = 1e4 + 10;
  7. int father[maxn], isRoot[maxn];
  8. set<int> birds;
  9. int findFa(int a){
  10. int b = a, t;
  11. while(father[a] != a) a = father[a];
  12. while(father[b] != b){
  13. t = father[b];
  14. father[b] = a;
  15. b = t;
  16. }
  17. return a;
  18. }
  19. void myUnion(int a, int b){
  20. int faA = findFa(a), faB = findFa(b);
  21. if(faA != faB){
  22. father[faB] = faA;
  23. isRoot[faA] += isRoot[faB];
  24. isRoot[faB] = 0;
  25. }
  26. }
  27. int main()
  28. {
  29. //初始化
  30. for(int i = 0; i < maxn; i ++) father[i] = i;
  31. fill(isRoot, isRoot + maxn, 1);
  32. int n, k, t, last;
  33. scanf("%d", &n);
  34. for(int i = 0; i < n; i ++){
  35. scanf("%d", &k);
  36. scanf("%d", &last);
  37. birds.insert(last);
  38. for(int j = 1; j < k; j ++){
  39. scanf("%d", &t);
  40. myUnion(last, t);
  41. birds.insert(t);
  42. }
  43. }
  44. int num = 0;
  45. for(int i = 1; i <= birds.size(); i ++){
  46. if(isRoot[i] != 0) num ++;
  47. }
  48. printf("%d %d\n", num, birds.size());
  49. scanf("%d", &k);
  50. int u, v, faA, faB;
  51. for(int i = 0; i < k; i ++){
  52. scanf("%d%d", &u, &v);
  53. faA = findFa(u), faB = findFa(v);
  54. if(faA == faB) printf("Yes\n");
  55. else printf("No\n");
  56. }
  57. system("pause");
  58. return 0;
  59. }

发表评论

表情:
评论列表 (有 0 条评论,180人围观)

还没有评论,来说两句吧...

相关阅读