https://www.luogu.com.cn/problem/CF979C
显然可以求需要先走到x再到y的点对数
如果x和y不在同一条链上,那就x的子树大小*y的子树大小就可以了
我们需要的是以x为根的时候,y的子树大小
以y为根的时候,x的子树大小
分别是n-从x开始搜,不经过y的点数
和n-从y开始搜,不经过x的点数
菜鸡本鸡。。。
#include<cstdio> using namespace std; #define N 300001 int front[N],nxt[N<<1],to[N<<1],tot; int s1,s2; void add(int u,int v) { to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; } void dfs(int x,int f,int y) { if(x==y) return; s1++; for(int i=front[x];i;i=nxt[i]) if(to[i]!=f) dfs(to[i],x,y); } void dfs2(int x,int f,int y) { if(x==y) return; s2++; for(int i=front[x];i;i=nxt[i]) if(to[i]!=f) dfs2(to[i],x,y); } int main() { int n,x,y,u,v; scanf("%d%d%d",&n,&x,&y); for(int i=1;i<n;++i) { scanf("%d%d",&u,&v); add(u,v); add(v,u); } dfs(x,0,y); dfs2(y,0,x); printf("%lld",1ll*n*(n-1)-1ll*(n-s1)*(n-s2)); }