Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.50 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3.  
  4. using namespace std;
  5. const int maxn = 2e5 + 3;
  6. vector<vector<int> > g;
  7. int tin[maxn], fup[maxn];
  8. bool used[maxn];
  9. int timer = 1;
  10. int a, b;
  11. bool fl1 = 0, fl2 = 0;
  12. void cpt(int v){
  13. if (v == a) fl1 = 1;
  14. if (v == b) fl2 = 1;
  15. }
  16. void dfs (int v, int p) {
  17. used[v] = 1;
  18. tin[v] = fup[v] = timer++;
  19. int children = 0;
  20. for (int i = 0; i< g[v].size(); i++) {
  21. int to = g[v][i];
  22. if (to == p) continue;
  23. if (used[to]){
  24. fup[v] = min(fup[v], tin[to]);
  25. }else{
  26. dfs(to, v);
  27. fup[v] = min(fup[v], fup[to]);
  28. if (fup[to] >= tin[v] && p != -1)
  29. cpt(v);
  30. children++;
  31. }
  32. }
  33. if (p == -1 && children > 1)
  34. cpt(v);
  35. }
  36. int dp[maxn];
  37. int goa(int v, int p){
  38. used[v] = 1;
  39. dp[v] = 1;
  40. for (int i = 0; i < g[v].size(); i++){
  41. int to = g[v][i];
  42. if (to == a){
  43. if (v != b) return 0;
  44. continue;
  45. }
  46. if (!used[to]){
  47. int ce = goa(to, v);
  48. if (v != b && ce == 0) return 0;
  49. dp[v] += ce;
  50. }
  51. }
  52. return dp[v];
  53. }
  54. int gob(int v, int p){
  55. used[v] = 1;
  56. dp[v] = 1;
  57. for (int i = 0; i < g[v].size(); i++){
  58. int to = g[v][i];
  59. if (to == b){
  60. if (v != a) return 0;
  61. continue;
  62. }
  63. if (!used[to]){
  64. int ce = gob(to, v);
  65. if (v != a && ce == 0) return 0;
  66. dp[v] += ce;
  67. }
  68. }
  69. return dp[v];
  70. }
  71. void solve(){
  72. int n, m;
  73. cin >> n >> m >> a >> b;
  74. a--, b--;
  75. g.resize(n);
  76. for (int i = 0; i < m; i++){
  77. int v, u;
  78. cin >> v >> u;
  79. v--, u--;
  80. g[v].push_back(u);
  81. g[u].push_back(v);
  82. }
  83. dfs(0, -1);
  84. if (!fl1 || !fl2){cout << 0 << '\n';
  85. for(int i = 0; i < n; i++){
  86. tin[i] = fup[i] = dp[i] = used[i] = 0;
  87. }
  88. fl1 = 0, fl2 = 0;
  89. g.clear();
  90. return;
  91. }
  92. for (int i = 0; i < maxn; i++) used[i] = 0;
  93. goa(b, -1);
  94. for (int i = 0; i < maxn; i++) used[i] = 0;
  95. gob(a, -1);
  96. // for (int i = 0; i < n; i++) cout << dp[i] << ' '; cout << endl;
  97. //cout << a << ' ' << dp[a] << ' ' << b << ' ' << dp[b] << endl;
  98. cout << (dp[a] - 1)*(dp[b] - 1) << '\n';
  99. for(int i = 0; i < n; i++){
  100. tin[i] = fup[i] = dp[i] = used[i] = 0;
  101. }
  102. fl1 = 0, fl2 = 0;
  103. g.clear();
  104. }
  105.  
  106. int main(){
  107.  
  108. int t;
  109. cin >> t;
  110. while(t--){
  111. solve();
  112. }
  113.  
  114.  
  115.  
  116.  
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement