题意;
给出一棵树,其中有两个点,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。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <vector> 5 using namespace std; 6 const int N = 3e5 + 10; 7 vector<int> g[N]; 8 int num[N]; 9 int par[N]; 10 int n,x,y; 11 int dfs(int u,int fa) 12 { 13 par[u] = fa; 14 int cnt = 0; 15 for (int v:g[u]) 16 { 17 if (v != fa) 18 { 19 cnt += dfs(v,u); 20 } 21 } 22 return num[u] = cnt + 1; 23 } 24 int main() 25 { 26 scanf("%d%d%d",&n,&x,&y); 27 for (int i = 1;i < n;i++) 28 { 29 int u,v; 30 scanf("%d%d",&u,&v); 31 g[u].push_back(v); 32 g[v].push_back(u); 33 } 34 dfs(x,-1); 35 long long ans = 0; 36 int m = y; 37 while (par[m] != x) 38 { 39 m = par[m]; 40 } 41 //printf("%d*\n",m); 42 ans = (long long) n * (n - 1); 43 ans -= (long long)num[y] * (1LL * (n - num[m])); 44 printf("%lld\n",ans); 45 return 0; 46 }
原文地址:https://www.cnblogs.com/kickit/p/9038994.html
时间: 2024-10-09 17:38:19