传送门
题解:只有a能到达的点的数量X只有b能到达的点的数量就是答案。
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+7;
int vis[N],ne[N<<1],head[N],e[N<<1];
typedef long long ll;
ll cnt;
void add(int a,int b)
{
e[cnt]=b,ne[cnt]=head[a],head[a]=cnt++;
}
void dfs(int u)
{
vis[u]=1;
for(int i=head[u];~i;i=ne[i]){
int j=e[i];
if(vis[j]) continue;
dfs(j);
}
}
int main()
{
int t; scanf("%d",&t);
while(t--){
memset(head,-1,sizeof head);
cnt=0;
int n,m,a,b; scanf("%d%d%d%d",&n,&m,&a,&b);
for(int i=1;i<=n;i++) vis[i]=0;
for(int i=1;i<=m;i++) {
int u,v; scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
vis[a]=1; dfs(b);
ll res1=0,res2=0;
for(int i=1;i<=n;i++) if(!vis[i]) res1++;
for(int i=1;i<=n;i++) vis[i]=0;
vis[b]=1; dfs(a);
for(int i=1;i<=n;i++) if(!vis[i]) res2++;
printf("%lld\n",1LL*res1*res2);
}
return 0;
}