GerONSo

Untitled

Dec 14th, 2019
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.98 KB | None | 0 0
  1. /*
  2.  
  3. ∧_∧
  4. ( ・ω・。)つ━☆・*。
  5. ⊂  ノ    ・゜
  6. しーJ   Accepted
  7.  
  8. */
  9.  
  10.  
  11.  
  12. // #pragma GCC optimize("O3")
  13. // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  14.  
  15. #include <bits/stdc++.h>
  16. #include <ext/pb_ds/assoc_container.hpp>
  17. #include <ext/pb_ds/tree_policy.hpp>
  18.  
  19. #define ll long long
  20. #define all(x) begin(x), end(x)
  21. #define x first
  22. #define y second
  23. #define int long long
  24.  
  25. using namespace std;
  26. using namespace __gnu_pbds;
  27.  
  28. typedef long double ld;
  29. template<typename T>
  30. using kawaii_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  31.  
  32. const ld PI = atan2(0, -1);
  33.  
  34. void seriy() {
  35. ios::sync_with_stdio(0);
  36. cin.tie(0);
  37. cout.tie(0);
  38. cout << fixed << setprecision(14);
  39. #ifdef _offline
  40. freopen("input.txt", "r", stdin);
  41. freopen("output.txt", "w", stdout);
  42. #endif
  43. }
  44.  
  45. const int MAXN = 2e5 + 100;
  46. const int MAXM = 600;
  47. const int INF = 1e9 + 7;
  48. const int BASE = 47;
  49. const int MOD = 1e9 + 7;
  50. const int MAXLOG = 21;
  51. const ld EPS = 1e-6;
  52.  
  53. vector<vector<int>> g, g2;
  54. vector<bool> used;
  55. vector<int> p, sz, act_sz;
  56. int n, m, a, b, cnt = 0, cur = 0;
  57.  
  58. void dfs(int u) {
  59. used[u] = 1;
  60. for(auto v : g[u]) {
  61. if(!used[v]) {
  62. // cerr << u << " " << v << '\n';
  63. g2[u].push_back(v);
  64. g2[v].push_back(u);
  65. dfs(v);
  66. }
  67. }
  68. }
  69.  
  70. void dfs2(int u) {
  71. used[u] = 1;
  72. cur++;
  73. // cerr << u << " " << g2.size() << '\n';
  74. for(auto v : g2[u]) {
  75. if(!used[v] && v != a && v != b) {
  76. dfs2(v);
  77. }
  78. else if(v == a) {
  79. cnt++;
  80. }
  81. else if(v == b) {
  82. cnt++;
  83. }
  84. }
  85. }
  86.  
  87. int get(int a) {
  88. if(p[a] == a) {
  89. return a;
  90. }
  91. return p[a] = get(p[p[a]]);
  92. }
  93.  
  94. void unite(int a, int b) {
  95. a = get(a);
  96. b = get(b);
  97. if(a != b) {
  98. if(sz[a] < sz[b]) {
  99. swap(a, b);
  100. }
  101. p[b] = a;
  102. sz[a] += sz[b];
  103. act_sz[a] += act_sz[b];
  104. }
  105. }
  106.  
  107. signed main() {
  108. seriy();
  109. int q;
  110. cin >> q;
  111. while(q--) {
  112. cin >> n >> m >> a >> b;
  113. a--;
  114. b--;
  115. g2.clear();
  116. g.clear();
  117. g.resize(n);
  118. g2.resize(n);
  119. used.resize(n);
  120. for(int i = 0; i < m; i++) {
  121. int u, v;
  122. cin >> u >> v;
  123. u--;
  124. v--;
  125. g[u].push_back(v);
  126. g[v].push_back(u);
  127. }
  128. dfs(0);
  129. int sss = 0, kek = -1;
  130. fill(all(used), 0);
  131. for(int i = 0; i < n; i++) {
  132. if(!used[i] && i != a && i != b) {
  133. cnt = 0;
  134. cur = 0;
  135. dfs2(i);
  136. if(cnt == 2) {
  137. kek = i;
  138. sss = cur;
  139. }
  140. }
  141. }
  142. p.resize(n);
  143. sz.resize(n, 1);
  144. act_sz.resize(n, 1);
  145. for(int i = 0; i < n; i++) {
  146. p[i] = i;
  147. }
  148. for(int i = 0; i < g2.size(); i++) {
  149. for(auto j : g2[i]) {
  150. if(i != a && j != a && i != b && j != b) unite(i, j);
  151. }
  152. }
  153. if(kek != -1) act_sz[get(kek)] -= sss;
  154. for(int i = 0; i < g.size(); i++) {
  155. for(auto j : g[i]) {
  156. if(i != a && j != a && i != b && j != b) unite(i, j);
  157. }
  158. }
  159. set<int> st;
  160. for(int i = 0; i < n; i++) {
  161. if(i != a && i != b) st.insert(get(i));
  162. }
  163. vector<int> lol;
  164. for(auto i : st) {
  165. lol.push_back(act_sz[i]);
  166. }
  167. vector<int> sum(lol.size() + 1);
  168. for(int i = sum.size() - 1; i >= 0; i--) {
  169. sum[i] = sum[i + 1] + lol[i];
  170. }
  171. int ans = 0;
  172. for(int i = 0; i < sum.size(); i++) {
  173. ans += lol[i] * sum[i + 1];
  174. }
  175. cout << ans << '\n';
  176. }
  177. return 0;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment