[换根DP]luogu P3647 [APIO2014]连珠线
题面
https://www.luogu.com.cn/problem/P3647
不重复地取树中相邻的两条边,每次得分为两条边权和,问最大得分
分析
容易想到状态 f[i][0/1] 分别表示 i 号点不作为/作为两条边的经过点的以 i 为根子树中的最大得分
显然有 $f[i][0]=/sum max(f[j][0],f[j][1]+w_{i,j})$
又因为显然只可能有一对相邻边穿过 i ,转移时减去 f[i][0] 中 j 的贡献再加上连接 i,j 的贡献即可
$f[i][1]=f[i][0]-max{f[j][0]+w_{i,j}-max(f[j][0],f[j][1]+w_{i,j}}$
换根也很容易, f[i][0] 的转移是简单加法,所以减去加上贡献即可
f[i][1]的转移包含了最大值,套路记录次大值即可,注意转移时父亲的贡献
代码

#include <iostream>
#include <cstdio>
using namespace std;
const int Inf=2147483647;
const int N=2e5+10;
struct Graph {
int v,w,nx;
}g[2*N];
int cnt,list[N];
int n,ans,f[N][2],mx[N][2]; void Add(int u,int v,int w) {g[++cnt]=(Graph){v,w,list[u]};list[u]=cnt;} void DFS(int u,int fa) {
mx[u][0]=mx[u][1]=f[u][1]=-Inf;
for (int i=list[u],val;i;i=g[i].nx)
if (g[i].v!=fa) {
DFS(g[i].v,u);
f[u][0]+=max(f[g[i].v][0],f[g[i].v][1]+g[i].w);
val=f[g[i].v][0]+g[i].w-max(f[g[i].v][0],f[g[i].v][1]+g[i].w);
if (mx[u][0]<val) mx[u][1]=mx[u][0],mx[u][0]=val;
else mx[u][1]=max(mx[u][1],val);
}
f[u][1]=f[u][0]+mx[u][0];
} void DFS(int u,int fa,int faw) {
if (fa) f[u][0]+=max(f[fa][0],f[fa][1]+faw);
ans=max(ans,f[u][0]);
for (int i=list[u],a,b;i;i=g[i].nx)
if (g[i].v!=fa) {
a=f[u][0];b=f[u][1];
f[u][0]-=max(f[g[i].v][0],f[g[i].v][1]+g[i].w);
f[u][1]=f[u][0]+((mx[u][0]==f[g[i].v][0]+g[i].w-max(f[g[i].v][0],f[g[i].v][1]+g[i].w))?mx[u][1]:mx[u][0]);
if (fa) f[u][1]=max(f[u][1],f[u][0]+f[fa][0]+faw-max(f[fa][0],f[fa][1]+faw));
DFS(g[i].v,u,g[i].w);
f[u][0]=a;f[u][1]=b;
}
} int main() {
scanf("%d",&n);
for (int i=1,u,v,w;i<n;i++) scanf("%d%d%d",&u,&v,&w),Add(u,v,w),Add(v,u,w);
DFS(1,0);DFS(1,0,0);printf("%d\n",ans);
}
[换根DP]luogu P3647 [APIO2014]连珠线的更多相关文章
- Luogu P3647 [APIO2014]连珠线
题目 换根dp. 显然对于给定的一棵有根树,蓝线都不能拐弯. 设\(f_{u,0}\)表示\(u\)不是蓝线中点时子树内的答案,\(f_{u,1}\)表示\(u\)是蓝线中点时子树内的答案.(以\(1 ...
- 洛谷$P3647\ [APIO2014]$连珠线 换根$dp$
正解:换根$dp$ 解题报告: 传送门! 谁能想到$9102$年了$gql$居然还没写过换根$dp$呢,,,$/kel$ 考虑固定了从哪个点开始之后,以这个点作为根,蓝线只可能是直上直下的,形如&qu ...
- [倍增][换根DP]luogu P5024 保卫王国
题面 https://www.luogu.com.cn/problem/P5024 分析 可以对有限制的点对之间的链进行在倍增上的DP数组合并. 需要通过一次正向树形DP和一次换根DP得到g[0][i ...
- 并不对劲的bzoj3677:p3647:[APIO2014]连珠线
题目大意 有一种生成\(n\)个点的树的方法为: 一开始有一个点,\(n-1\)次操作,每次可以有两种操作:1.选一个点,用一条红边将它与新点连接:2.将新点放在一条红边上,新点与这条红边两端点直接的 ...
- 洛谷 P3647 [APIO2014]连珠线(换根 dp)
题面传送门 题意: 桌子上有 \(1\) 个珠子,你要进行 \(n-1\) 次操作,每次操作有以下两种类型: 拿出一个新珠子,并选择一个桌子上的珠子,在它们之间连一条红线 选择两个由红线相连的珠子 \ ...
- 【BZOJ3677】[Apio2014]连珠线 换根DP
[BZOJ3677][Apio2014]连珠线 Description 在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做“连珠线”.不出所料,玩这个游戏只需要珠子和线,珠子从1到礼编号,线分为红色 ...
- [Bzoj3677][Apio2014]连珠线(树形dp)
3677: [Apio2014]连珠线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 434 Solved: 270[Submit][Status] ...
- 题解 [APIO2014]连珠线
题解 [APIO2014]连珠线 题面 解析 首先这连成的是一棵树啊. 并且\(yy\)一下,如果钦定一个根, 那么这上面的蓝线都是爸爸->儿子->孙子这样的,因为像下图这样的构造不出来: ...
- 【LG3647】[APIO2014]连珠线
[LG3647][APIO2014]连珠线 题面 洛谷 题解 首先考虑一下蓝线连起来的情况,一定是儿子-父亲-另一个儿子或者是儿子-父亲-父亲的父亲. 而因为一开始只有一个点在当前局面上,将一条红边变 ...
随机推荐
- macOS 没有鼠标 怎么使用 快捷键
macOS 没有鼠标 怎么使用 快捷键 mini 链接蓝牙鼠标 菜单选择 光标聚焦 上下选择 确认,选中 用键盘浏览菜单 若要使用这些快捷键,请先按下 Control-F2 或 Fn-Control- ...
- 智能合约稳定币USDN的价值在哪里?
近几年来,区块链和数字货币市场快速发展,客观上需要价格相对稳定的交易媒介和贮藏手段,从而推动以链上资产或链下资产抵押型稳定币和算法型稳定币出现,以实现币价相对稳定的数字货币.市场上开始出现了诸如USD ...
- Baccarat是如何运用去中心化治理模式的?
区块链的出现,让大家看到了去中心化的可能.去中心化的数字资产从最初的默默无闻,一路起起伏伏发展了十年,逐渐成为了大众认可的价值存储方式.去中心化的金融,使数字资产的生态建设者意识到,即使没有中心化的金 ...
- Spark在处理数据的时候,会将数据都加载到内存再做处理吗?
对于Spark的初学者,往往会有一个疑问:Spark(如SparkRDD.SparkSQL)在处理数据的时候,会将数据都加载到内存再做处理吗? 很显然,答案是否定的! 对该问题产生疑问的根源还是对Sp ...
- springCloud服务流程
springCloud的服务流程:消费者调用生产者 1.通过接口化的请求调用(指定接口的服务名字和服务地址)只是做定义,并没有真正做到. 2.Feign组件,远程去注册中心找到服务的名字和服务的地址然 ...
- JUC学习
JUC是java.util.concurrent包 并发编程的工具包 并发.并行 并发:多线程操作一个资源 并行:多人一起走 并发编程的本质:充分利用cpu的资源 线程的几个状态 新建 运行 堵塞 等 ...
- 资源授权?对OAuth2.0的一次重新认识的过程
什么是OAuth? OAuth一个开放的授权标准,允许用户在不提供关键信息(如账号,密码)给第三方应用的前提下,让第三方应用去访问用户在某网站上的资源(如头像,用户昵称等). OAuth分为OAuth ...
- 解决QQ能正常上网但是网页无法打开的办法
最近网页老师稀里糊涂的打不开,在这里附上参考的行之有效的办法. https://baijiahao.baidu.com/s?id=1645363213803553998&wfr=spider& ...
- tesseract-ocr和tesseract.exe is not installed or it's not in your path问题解决
一.解决方案: 1.http://www.ddooo.com/softdown/94968.htm 打开下载的压缩包,找到"tesseract-ocr-setup-3.02.02.exe ...
- 后端程序员之路 12、K最近邻(k-Nearest Neighbour,KNN)分类算法
K最近邻(k-Nearest Neighbour,KNN)分类算法,是最简单的机器学习算法之一.由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重 ...