求调样例,悬关
查看原帖
求调样例,悬关
637788
kimi0705楼主2023/12/3 23:03
#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int N = 2e5 + 10;
int T, n, m, a, b, x, y;
int vis[N];
vector <int> Edge[N];
void init() {for (int i = 1; i <= n; i ++) vis[i] = 0;return;}
int dfs1(int x) {
    int ans = 1;
    if(x == b) return 0;
    vis[x] = 1;
    for (int i : Edge[x]) {
        if(vis[i]) continue;
        int tmp = dfs1(i);
        if(tmp == 0 && x != a) {vis[x] = 0;return 0;}
        ans += tmp;
    }
    return ans;
}
int dfs2(int x) {
    int ans = 1;
    if(x == a) return 0;
    vis[x] = 1;
    for (int i : Edge[x]) {
        if(vis[i]) continue;
        int tmp = dfs2(i);
        if(tmp == 0 && x != b) {vis[x] = 0;return 0;}
        ans += tmp;
    }
    return ans;
}
signed main() {
    scanf("%lld", &T);
    while(T--) {
        scanf("%lld%lld", &n, &m);
        scanf("%lld%lld", &a, &b);
        for (int i = 1; i <= m; i++) {
            scanf("%lld%lld", &x, &y);
            Edge[x].push_back(y);
            Edge[y].push_back(x);
        }
        init();
        int A = dfs1(a) - 1;
        init();
        int B = dfs2(b) - 1;
        printf("%lld\n", A * B);
    }
}
2023/12/3 23:03
加载中...