题意;

给出一棵树,其中有两个点,x和y,限制走了x之后的路径上不能有y,问可以走的路径(u,v)有多少条,(u,v)和(v,u)考虑为两条不同的路径。

思路:

简单树形dp,dfs统计在x到y路径(不包括x和y)之外的所有点,在x这边的有a个,y这边的有b个,那么答案就是n*(n-1) - a * b。

代码:

 #include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 3e5 + ;
vector<int> g[N];
int num[N];
int par[N];
int n,x,y;
int dfs(int u,int fa)
{
par[u] = fa;
int cnt = ;
for (int v:g[u])
{
if (v != fa)
{
cnt += dfs(v,u);
}
}
return num[u] = cnt + ;
}
int main()
{
scanf("%d%d%d",&n,&x,&y);
for (int i = ;i < n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(x,-);
long long ans = ;
int m = y;
while (par[m] != x)
{
m = par[m];
}
//printf("%d*\n",m);
ans = (long long) n * (n - );
ans -= (long long)num[y] * (1LL * (n - num[m]));
printf("%lld\n",ans);
return ;
}
05-07 12:28