当前位置:   article > 正文

E. Tree Painting(换根dp)_e tree painting

e tree painting

题目链接

题意:给你一颗树,一开始树的结点都是白色的。开始染色,一开始你可以将任意一个白色结点染成黑色,随后只能给黑色结点旁边的白色结点染色,每次染色能获得与这个结点联通的所有白色结点积分数。问怎样染色可以使积分数最多。

题解:

 

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 2e5+100;
  5. vector<int>e[N];
  6. int n;
  7. ll sz[N],dp[N],ans;
  8. void dfs1(int u,int fa){
  9. sz[u]=1;
  10. for(int i=0;i<e[u].size();++i){
  11. int v = e[u][i];
  12. if(v==fa) continue;
  13. dfs1(v,u);
  14. sz[u]+=sz[v];
  15. dp[u]+=dp[v];
  16. }
  17. dp[u]+=sz[u];
  18. }
  19. void dfs2(int u,int fa){
  20. ans=max(ans,dp[u]);
  21. for(int i=0;i<e[u].size();++i){
  22. int v = e[u][i];
  23. if(v==fa) continue;
  24. ll res = dp[u] - sz[v] - dp[v];
  25. dp[v] = dp[v] + res + (n-sz[v]);
  26. dfs2(v,u);
  27. }
  28. }
  29. int main()
  30. {
  31. cin>>n;
  32. for(int i=1;i<n;++i){
  33. int u,v;
  34. cin>>u>>v;
  35. e[u].push_back(v);
  36. e[v].push_back(u);
  37. }
  38. dfs1(1,0);
  39. dfs2(1,0);
  40. cout<<ans<<endl;
  41. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/75091
推荐阅读
相关标签
  

闽ICP备14008679号