题目链接
题意:给定n个点,m条路构成的无向图,给出点a和b,问有多少对点的路径必须经过a和b
思路:先dfs一下,看看不经过点a就能到达的点标记一下,这样未标记的点他们就是一定要经过点a的点的数量,记为cnt1,同理,必须经典点b的点的数量记为cnt2,答案就是cnt1*cnt2
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+1;
typedef long long ll;
int T,n,m,a,b,u,v,vis[maxn];
ll cnt1,cnt2;
vector<int>g[maxn];
void dfs(int a,int b)
{
vis[a]=1;
if(a==b) return ;
for(int to:g[a])
if(!vis[to]) dfs(to,b);
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&n,&m,&a,&b);
cnt1=cnt2=0;
for(int i=1;i<=n;++i) g[i].clear(),vis[maxn]=0;
while(m--){
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(a,b);
for(int i=1;i<=n;++i) {
if(!vis[i]) cnt1++;
else vis[i]=0;
}
dfs(b,a);
for(int i=1;i<=n;++i) {
if(!vis[i]) cnt2++;
else vis[i]=0;
}
printf("%lld\n",cnt1*cnt2);
}
}