博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #384 (Div. 2) D. Chloe and pleasant prizes(树形DP)
阅读量:4952 次
发布时间:2019-06-12

本文共 987 字,大约阅读时间需要 3 分钟。

题目链接:

题意:

给你一棵树,树上每一个点有一个权值,现在让你选两个点a,b,使得a不是b的子节点且b不是a的子节点,问最大的ans。

ans的定义是sum(a)+sum(b)(sum(a)以a为根的所以子节点权值和(包括a),b同理)。

题解:

dp[i]记录以i这个节点为根的最大子节点的sum,f[i]记录sum[i],然后dfs下去,中途更新答案即可。

1 #include
2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 typedef long long ll; 5 6 const int N=2e5+7; 7 int a[N],n,g[N],nxt[N*2],v[N*2],ed; 8 ll dp[N],f[N],ans,inf=1ll<<61; 9 10 void adg(int x,int y){v[++ed]=y,nxt[ed]=g[x],g[x]=ed;}11 inline void up(ll &a,ll b){
if(a
-inf)up(ans,dp[u]+dp[v[i]]);20 up(dp[u],dp[v[i]]),f[u]+=f[v[i]];21 }22 up(dp[u],f[u]);23 }24 25 int main()26 {27 scanf("%d",&n);28 F(i,1,n)scanf("%d",a+i);29 F(i,1,n-1)30 {31 int x,y;32 scanf("%d%d",&x,&y);33 adg(x,y),adg(y,x);34 }35 ans=-inf,dfs(1,0);36 if(ans>-inf)printf("%lld\n",ans);37 else puts("Impossible");38 return 0; 39 }
View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/6183024.html

你可能感兴趣的文章
身份证校验原理和PHP实现
查看>>
[Locked] Wiggle Sort
查看>>
deque
查看>>
Ext JS学习第十三天 Ext基础之 Ext.Element
查看>>
python--迭代器与生成器
查看>>
SQL之case when then用法详解
查看>>
STL 排序函数
查看>>
Microsoft Dynamics CRM 2011 面向Internet部署 (IFD) ADFS虚拟机环境搭建的步骤(CRM与ADFS装在同一台服务器上) 摘自网络...
查看>>
Setting up a Passive FTP Server in Windows Azure VM(ReplyCode: 227, Entering Passive Mode )
查看>>
Atitit mtp ptp rndis midi协议的不同区别
查看>>
Ajax辅助方法
查看>>
Python模块调用
查看>>
委托的调用
查看>>
c#中从string数组转换到int数组
查看>>
Scrapy入门程序点评
查看>>
DotNetty网络通信框架学习之源码分析
查看>>
8.1 Android Basic 数据存储 Preferences Structured(分组的Preferences)
查看>>
原因和证明
查看>>
VC6.0图像处理2--图像的反色
查看>>
Snoop, 对WPF程序有效的SPY++机制
查看>>