codeforces 979C Kuro and Walking Route

题意;

给出一棵树,其中有两个点,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 }

猜你喜欢

转载自www.cnblogs.com/kickit/p/9038994.html