经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
ZROJ#398. 【18提高7】随机游走(期望dp 树形dp)
来源:cnblogs  作者:自为风月马前卒  时间:2018/10/16 9:36:15  对本文有异议

题意

[题目链接]版权原因就不发了。。

给出一棵树,求出任意两点之间期望距离的最大值

Sol

比较清真的一道题吧。。

\(f[x]\)表示从\(x\)走到\(x\)的父亲的期望步数

\(g[x]\)表示从父亲走来的期望步数

\(d[x]\)表示\(x\)节点的度数

不难得到方程\(f[x] = \sum_{to \in son[x]} f[to] + d[x]\)

\(g[x] = g[fa[x]] + \sum_{to \in son[fa[x]] \text{且} to \not = x} f[to] + d[fa[x]]\)

最后计算的时候维护向上向下最大值即可

当然,仔细观察不难发现\(f[x]\)即为子树中所有节点的度数

\(g[x]\)为整棵树中除子树外节点的度数

考虑每条边的贡献后不难得到

\(f[x] = 2 * siz[x] - 1\)

\(g[x] = 2 * (N - siz[x]) - 1\)

  1. #include<bits/stdc++.h>
  2. #define chmax(a, b) (a = a > b ? a : b)
  3. #define LL long long
  4. const int MAXN = 1e5 + 10;
  5. inline int read() {
  6. char c = getchar(); int x = 0, f = 1;
  7. while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
  8. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  9. return x * f;
  10. }
  11. std::vector<int> v[MAXN];
  12. int N, up[MAXN], down[MAXN], d[MAXN], siz[MAXN], ans, f[MAXN], g[MAXN];
  13. void dfs3(int x, int fa) {
  14. siz[x] = 1;
  15. for(int i = 0, to; i < v[x].size(); i++) {
  16. if((to = v[x][i]) == fa) continue;
  17. dfs3(to, x);
  18. siz[x] += siz[to];
  19. ans = std::max(ans, std::max(up[x] + g[to] + down[to], down[x] + f[to] + up[to]));
  20. chmax(up[x], up[to] + f[to]);
  21. chmax(down[x], down[to] + g[to]);
  22. // chmax(ans, up[x] + down[x]);
  23. }
  24. f[x] = (siz[x] << 1) - 1;
  25. g[x] = ((N - siz[x]) << 1) - 1;
  26. }
  27. int main() {
  28. N = read();
  29. for(int i = 1; i < N; i++) {
  30. int x = read(), y = read(); d[x]++; d[y]++;
  31. v[x].push_back(y); v[y].push_back(x);
  32. }
  33. dfs3(1, 0);
  34. printf("%lld", ans); puts(".00000");
  35. return 0;
  36. }
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号