Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- const int maxn = 2e5 + 3;
- vector<vector<int> > g;
- int tin[maxn], fup[maxn];
- bool used[maxn];
- int timer = 1;
- int a, b;
- bool fl1 = 0, fl2 = 0;
- void cpt(int v){
- if (v == a) fl1 = 1;
- if (v == b) fl2 = 1;
- }
- void dfs (int v, int p) {
- used[v] = 1;
- tin[v] = fup[v] = timer++;
- int children = 0;
- for (int i = 0; i< g[v].size(); i++) {
- int to = g[v][i];
- if (to == p) continue;
- if (used[to]){
- fup[v] = min(fup[v], tin[to]);
- }else{
- dfs(to, v);
- fup[v] = min(fup[v], fup[to]);
- if (fup[to] >= tin[v] && p != -1)
- cpt(v);
- children++;
- }
- }
- if (p == -1 && children > 1)
- cpt(v);
- }
- int dp[maxn];
- int goa(int v, int p){
- used[v] = 1;
- dp[v] = 1;
- for (int i = 0; i < g[v].size(); i++){
- int to = g[v][i];
- if (to == a){
- if (v != b) return 0;
- continue;
- }
- if (!used[to]){
- int ce = goa(to, v);
- if (v != b && ce == 0) return 0;
- dp[v] += ce;
- }
- }
- return dp[v];
- }
- int gob(int v, int p){
- used[v] = 1;
- dp[v] = 1;
- for (int i = 0; i < g[v].size(); i++){
- int to = g[v][i];
- if (to == b){
- if (v != a) return 0;
- continue;
- }
- if (!used[to]){
- int ce = gob(to, v);
- if (v != a && ce == 0) return 0;
- dp[v] += ce;
- }
- }
- return dp[v];
- }
- void solve(){
- int n, m;
- cin >> n >> m >> a >> b;
- a--, b--;
- g.resize(n);
- for (int i = 0; i < m; i++){
- int v, u;
- cin >> v >> u;
- v--, u--;
- g[v].push_back(u);
- g[u].push_back(v);
- }
- dfs(0, -1);
- if (!fl1 || !fl2){cout << 0 << '\n';
- for(int i = 0; i < n; i++){
- tin[i] = fup[i] = dp[i] = used[i] = 0;
- }
- fl1 = 0, fl2 = 0;
- g.clear();
- return;
- }
- for (int i = 0; i < maxn; i++) used[i] = 0;
- goa(b, -1);
- for (int i = 0; i < maxn; i++) used[i] = 0;
- gob(a, -1);
- // for (int i = 0; i < n; i++) cout << dp[i] << ' '; cout << endl;
- //cout << a << ' ' << dp[a] << ' ' << b << ' ' << dp[b] << endl;
- cout << (dp[a] - 1)*(dp[b] - 1) << '\n';
- for(int i = 0; i < n; i++){
- tin[i] = fup[i] = dp[i] = used[i] = 0;
- }
- fl1 = 0, fl2 = 0;
- g.clear();
- }
- int main(){
- int t;
- cin >> t;
- while(t--){
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement