Advertisement
Dzham

Untitled

Apr 28th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. class DSU {
  6. std::vector<int> dsu;
  7. std::vector<int> sizes;
  8. std::vector<bool> is_root;
  9. std::vector<int> smallest;
  10. std::vector<int> depth;
  11. int result = 0;
  12. bool updated = true;
  13.  
  14. public:
  15. DSU(int n) {
  16. for (int i = 0; i < n; ++i) {
  17. dsu.push_back(i);
  18. smallest.push_back(i);
  19. }
  20. sizes.resize(n, 1);
  21. depth.resize(n, 0);
  22. is_root.resize(n, true);
  23. }
  24.  
  25. int find_root(int a) {
  26. if (dsu[a] == a) {
  27. return a;
  28. }
  29. return dsu[a] = find_root(dsu[a]);
  30. }
  31.  
  32. void union_dsu(int a, int b) {
  33. a = find_root(a);
  34. b = find_root(b);
  35. if (a != b) {
  36. updated = false;
  37. if (depth[b] < depth[a]) {
  38. dsu[b] = a;
  39. sizes[a] += sizes[b];
  40. is_root[b] = false;
  41. smallest[a] = std::min(smallest[a], smallest[b]);
  42. } else {
  43. dsu[a] = b;
  44. sizes[b] += sizes[a];
  45. is_root[a] = false;
  46. smallest[b] = std::min(smallest[a], smallest[b]);
  47. if (depth[b] == depth[a]) {
  48. depth[b]++;
  49. }
  50. }
  51. }
  52. }
  53.  
  54. int city() {
  55. if (updated) {
  56. if (result == -1) {
  57. return -1;
  58. }
  59. return result + 1;
  60. }
  61. int res = dsu.size();
  62. for (int i = 0; i < dsu.size(); ++i) {
  63. if (is_root[i] && sizes[i] % 2 == 1 && smallest[i] < res) {
  64. res = smallest[i];
  65. }
  66. }
  67. updated = true;
  68. if (res == dsu.size()) {
  69. result = -1;
  70. return -1;
  71. } else {
  72. result = res;
  73. return result + 1;
  74. }
  75. }
  76. };
  77.  
  78. int main() {
  79. int n, m;
  80. std::cin >> n >> m;
  81. DSU dsu(n);
  82. char command;
  83. int a, b;
  84. for (int i = 0; i < m; ++i) {
  85. std::cin >> command;
  86. if (command == 'a') {
  87. std::cin >> a >> b;
  88. dsu.union_dsu(a - 1, b - 1);
  89. } else {
  90. std::cout << dsu.city() << '\n';
  91. }
  92. }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement