CF979C Kuro and Walking Route

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));
}
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/13761365.html