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];
  7.  
  8. void make_set(){
  9. // Đặt nút "cha" của mỗi tập hợp là chính nó
  10. for (int i = 1; i <= n; i++) parent[i] = i;
  11. }
  12.  
  13. int find(int x){
  14. // Ta sử dụng kĩ thuật nén đường đi để tối ưu
  15. if (parent[x] == x) return x;
  16. int p = find(parent[x]);
  17. parent[x] = p;
  18. return p;
  19. }
  20.  
  21. void set_union(int a, int b){
  22. // Đặt nút "cha" của b là a
  23. a = find(a); b = find(b);
  24. if (a != b){
  25. parent[b] = a;
  26. }
  27. }
  28.  
  29. void input(){
  30. cin >> n >> q;
  31. make_set();
  32. for (int i = 1; i <= q; i++){
  33. int t, u, v;
  34. cin >> t >> u >> v;
  35.  
  36. if (t == 1){
  37. // Nối 2 đỉnh u, v
  38. set_union(u, v);
  39. }
  40. else{
  41. // Kiểm tra xem 2 đỉnh u, v có được kết nối hay không?
  42. if (find(u) == find(v)) cout << "YES" << endl;
  43. else cout << "NO" << endl;
  44. }
  45. }
  46. }
  47.  
  48. int main(){
  49. input();
  50.  
  51. return 0;
  52. }
Success #stdin #stdout 0.01s 5284KB
stdin
6 5
1 1 2
1 1 3
2 2 3
1 5 6
2 4 5
stdout
YES
NO