fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int n, q;
  5. const int N = 1e5 + 5;
  6. int parent[N], sz[N];
  7.  
  8. void make_set(){
  9. // Đặt nút "cha" của mỗi tập hợp là chính nó
  10. // Tuy nhiên, ở đây ta đặt kích cỡ của tập hợp là chính nó, do đề bài yêu cầu tính tổng các đỉnh thành phần
  11. for (int i = 1; i <= n; i++){
  12. parent[i] = i;
  13. sz[i] = i;
  14. }
  15. }
  16.  
  17. int find(int x){
  18. // Ta sử dụng kĩ thuật nén đường đi để tối ưu
  19. if (parent[x] == x) return x;
  20. int p = find(parent[x]);
  21. parent[x] = p;
  22. return p;
  23. }
  24.  
  25. void set_union(int a, int b){
  26. // Đặt nút "cha" của b là a
  27. a = find(a); b = find(b);
  28. if (a != b){
  29. /*
  30.   Ở đây ta dùng swap để thuận tiện hơn
  31.   Thay đổi kích cỡ của tập hợp a
  32.   Đặt nút "cha" của b là a
  33.   */
  34. if (sz[a] < sz[b]) swap(a, b);
  35. sz[a] += sz[b];
  36. parent[b] = a;
  37. }
  38. }
  39.  
  40. void input(){
  41. cin >> n >> q;
  42. make_set();
  43. for (int i = 1; i <= q; i++){
  44. int t, u, v;
  45. cin >> t;
  46.  
  47. if (t == 1){
  48. // Nối 2 đỉnh u, v
  49. cin >> u >> v;
  50. set_union(u, v);
  51. }
  52. else{
  53. // In ra tổng thành phần của đỉnh u
  54. cin >> u;
  55. cout << sz[find(u)] << endl;
  56. }
  57. }
  58. }
  59.  
  60. int main(){
  61. input();
  62.  
  63. return 0;
  64. }
Success #stdin #stdout 0.01s 5288KB
stdin
6 5
1 1 2
1 1 3
2 2
1 5 6
2 4
stdout
6
4