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));
}

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-09-11
  • 2022-12-23
  • 2022-12-23
  • 2021-10-15
  • 2021-08-24
  • 2021-09-24
猜你喜欢
  • 2022-12-23
  • 2022-01-13
  • 2022-12-23
  • 2021-12-13
  • 2021-07-06
  • 2021-06-25
相关资源
相似解决方案