题目:Work Group

树形dp,设状态f[u][0/1] 表示以u为根节点,他的子树中选了0(偶数)1(奇数)个节点的最大价值,设x为他的一个儿子,显然f[u][1]=max(f[k][0]+f[u][1],f[k][1]+f[u][0]),f[u][0]=max(f[k][0]+f[u][0],f[k][1]+f[u][1])

最后再加上自身权值即可,答案为f[1][1]

代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
const int N=2e5+5;
using namespace std;
struct graph
{
int to,nxt;
graph(int tt,int nn)
{
to=tt;nxt=nn;
}
graph(){
}
}e[N];
int n,head[N],tot,a[N],vis[N];
long long dp[N][2];
void adde(int u,int v)
{
++tot;
e[tot]=graph(v,head[u]);
head[u]=tot;
}
void dfs(int u)
{
vis[u]=1;
for(int i=head[u];i;i=e[i].nxt)
{
int k=e[i].to;
if(vis[k])
continue;
dfs(k);
long long x=dp[u][0],y=dp[u][1];
dp[u][1]=max(x+dp[k][1],y+dp[k][0]);
dp[u][0]=max(x+dp[k][0],y+dp[k][1]);
}
dp[u][1]=max(dp[u][1],dp[u][0]+a[u]);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int v;
scanf("%d %d",&v,&a[i]);
dp[i][1]=-2e18;
if(v!=-1)
adde(v,i);
}
dfs(1);
printf("%lld\n",dp[1][1]);
return 0;
}

最新文章

  1. 【JavaScript 插件】实现图片倒影效果 - reflex.js
  2. [Maven]Apache Maven 入门篇
  3. Longest Common Subsequence
  4. NGINX: 405 Not Allowed
  5. java语言的认识
  6. HEX格式数据转换成十六进制字符串
  7. NTFS碎片
  8. jquery之insertBefore(),insertAfter(),prependTo(),appendTo()用法详解
  9. Python3字典中items()和python2.x中iteritems()有什么区别
  10. sublineText
  11. careercup-树与图 4.2
  12. 《Mathematical Olympiad——组合数学》——染色问题
  13. storm教程
  14. 一位资深程序员给予Java初学者的学习路线建议
  15. Python3|ddt|unittest|浅议数据驱动测试
  16. Review: Command-line about Git
  17. Python自学:第三章 使用方法sort( )对列表进行永久性排序
  18. mesh函数
  19. Python Redis set集合
  20. 基于C++11实现线程池的工作原理

热门文章

  1. 字符类数据类型和oracle字符类型的区别
  2. Netty 学习(三):通信协议和编解码
  3. Windows优先使用IPv4
  4. 跟我学Python图像处理丨关于图像金字塔的图像向下取样和向上取样
  5. 【学习笔记】卷积神经网络 (CNN )
  6. Elastic:为Elastic Docker部署设置安全
  7. Kubernetes 监控--PromQL
  8. 【前端必会】webpack 插件,前进路绕不过的障碍
  9. [ML从入门到入门] 支持向量机:从SVM的推导过程到SMO的收敛性讨论
  10. 《Spatial-Spectral T ransformer for Hyperspectral Image Classification》论文笔记