• 并查集(合并集合,连通块的点的数量)


    836. 合并集合

    一共有 n

    个数,编号是 1∼n

    ,最开始每个数各自在一个集合中。

    现在要进行 m

    个操作,操作共有两种:

    1. M a b,将编号为 a

    和 b

    • 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
    • Q a b,询问编号为 a
    • 和 b
      1. 的两个数是否在同一个集合中;

      输入格式

      第一行输入整数 n

      和 m

      接下来 m

      行,每行包含一个操作指令,指令为 M a bQ a b 中的一种。

      输出格式

      对于每个询问指令 Q a b,都要输出一个结果,如果 a

      和 b

      在同一集合内,则输出 Yes,否则输出 No

      每个结果占一行。

      数据范围

      1≤n,m≤105

      输入样例:

      1. 4 5
      2. M 1 2
      3. M 3 4
      4. Q 1 2
      5. Q 1 3
      6. Q 3 4

      输出样例:

      1. Yes
      2. No
      3. Yes

     

    1. #include <iostream>
    2. #include <algorithm>
    3. using namespace std;
    4. const int maxn = 1e5+10;
    5. int fath[maxn];
    6. int find(int u)
    7. {
    8. if(fath[u]<0)
    9. return u;
    10. else
    11. fath[u]=find(fath[u]);
    12. }
    13. int main()
    14. {
    15. int n,m;
    16. cin >> n >> m;
    17. fill(fath,fath+maxn,-1);
    18. while (m -- )
    19. {
    20. char op;
    21. int u,v;
    22. cin >> op >> u >> v;
    23. int fau=find(u),fav=find(v);
    24. if(op == 'M')
    25. {
    26. if(fau!=fav)
    27. fath[fau]=fav;
    28. }
    29. else
    30. {
    31. if(fau==fav)
    32. puts("Yes");
    33. else
    34. puts("No");
    35. }
    36. }
    37. return 0;
    38. }

    837. 连通块中点的数量

    给定一个包含 n

    个点(编号为 1∼n

    )的无向图,初始时图中没有边。

    现在要进行 m

    个操作,操作共有三种:

    1. C a b,在点 a

    和点 b 之间连一条边,a 和 b

    • 可能相等;
    • Q1 a b,询问点 a
    • 和点 b 是否在同一个连通块中,a 和 b
    • 可能相等;
    • Q2 a,询问点 a
    1. 所在连通块中点的数量;

    输入格式

    第一行输入整数 n

    和 m

    接下来 m

    行,每行包含一个操作指令,指令为 C a bQ1 a bQ2 a 中的一种。

    输出格式

    对于每个询问指令 Q1 a b,如果 a

    和 b

    在同一个连通块中,则输出 Yes,否则输出 No

    对于每个询问指令 Q2 a,输出一个整数表示点 a

    所在连通块中点的数量

    每个结果占一行。

    数据范围

    1≤n,m≤105

    输入样例:

    1. 5 5
    2. C 1 2
    3. Q1 1 2
    4. Q2 1
    5. C 2 5
    6. Q2 5

    输出样例:

    1. Yes
    2. 2
    3. 3

    1. #include <iostream>
    2. #include <algorithm>
    3. using namespace std;
    4. const int maxn = 1e5+10;
    5. int fath[maxn];
    6. int find(int u)
    7. {
    8. if(fath[u]<0)
    9. return u;
    10. else
    11. fath[u]=find(fath[u]);
    12. }
    13. int main()
    14. {
    15. int n,m;
    16. cin >> n >> m;
    17. fill(fath,fath+maxn,-1);
    18. while (m -- )
    19. {
    20. string op;
    21. int u,v;
    22. cin >> op;
    23. if(op == "C")
    24. {
    25. cin >> u >> v;
    26. int fau=find(u),fav=find(v);
    27. if(fau!=fav)
    28. {
    29. fath[fav]+=fath[fau];
    30. fath[fau]=fav;
    31. }
    32. }
    33. else if(op == "Q1")
    34. {
    35. cin >> u >> v;
    36. int fau=find(u),fav=find(v);
    37. if(fau==fav)
    38. puts("Yes");
    39. else
    40. puts("No");
    41. }
    42. else
    43. {
    44. cin >> u;
    45. cout << -fath[find(u)] << endl;
    46. }
    47. }
    48. return 0;
    49. }

     

  • 相关阅读:
    git分支开发管理实践
    多线程系列(三) -synchronized 关键字使用详解
    Hadoop3教程(十):MapReduce中的InputFormat
    dolphinscheduler-数据质量-源码分析
    数据结构--7.1散列表(哈希表)查找
    掌握这个技巧,一键实现把文字转语音,用过都说好
    数据结构-链表(java)
    Python算法——二叉树遍历
    CSS 滚动驱动动画 view()
    activeMq将mqtt发布订阅转成消息队列
  • 原文地址:https://blog.csdn.net/qq_51825761/article/details/126885486