https://ac.nowcoder.com/acm/contest/2908/G
思路:显然地,对于n个点而言,总共可以走的路径数为n*(n-1)
对于所求地就有可走路径=总路径数-不可走路径数
那么问题就转化成了如何计算不可走地路径数
可以这样考虑
对于节点a而言,他的子树的节点如果要走出这颗子树外,那么一定要经过点a
所以我们可以把x当作树根,算出y的子树大小,然后再以y当树根,算出x的子树大小
那么不可走路径数即为两数相乘 (子树大小:以该节点为父节点下的节点个数)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define me(a,x) memset(a,x,sizeof a)
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define all(x) (x).begin(), (x).end()
#define pb(a) push_back(a)
#define paii pair<int,int>
#define pali pair<ll,int>
#define pail pair<int,ll>
#define pall pair<ll,ll>
#define x first
#define y second
vector<int> g[400005];
int s[400005];
int n,x,y;
void dfs(int x,int f){
s[x]=1;
for(auto it:g[x]){
if(it!=f){
dfs(it,x);
s[x]+=s[it];
}
}
}
int main()
{
///freopen("1.in","r",stdin);
///freopen("1.out","w",stdout);
cin>>n>>x>>y;
rep(i,0,n-1){
int a,b;
cin>>a>>b;
g[a].pb(b);
g[b].pb(a);
}
dfs(x,0);
int k=s[y];
me(s,0);
dfs(y,0);
cout<<1ll*n*(n-1)-1ll*k*s[x]<<endl;
return 0;
}