题面

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]连珠线的更多相关文章

  1. Luogu P3647 [APIO2014]连珠线

    题目 换根dp. 显然对于给定的一棵有根树,蓝线都不能拐弯. 设\(f_{u,0}\)表示\(u\)不是蓝线中点时子树内的答案,\(f_{u,1}\)表示\(u\)是蓝线中点时子树内的答案.(以\(1 ...

  2. 洛谷$P3647\ [APIO2014]$连珠线 换根$dp$

    正解:换根$dp$ 解题报告: 传送门! 谁能想到$9102$年了$gql$居然还没写过换根$dp$呢,,,$/kel$ 考虑固定了从哪个点开始之后,以这个点作为根,蓝线只可能是直上直下的,形如&qu ...

  3. [倍增][换根DP]luogu P5024 保卫王国

    题面 https://www.luogu.com.cn/problem/P5024 分析 可以对有限制的点对之间的链进行在倍增上的DP数组合并. 需要通过一次正向树形DP和一次换根DP得到g[0][i ...

  4. 并不对劲的bzoj3677:p3647:[APIO2014]连珠线

    题目大意 有一种生成\(n\)个点的树的方法为: 一开始有一个点,\(n-1\)次操作,每次可以有两种操作:1.选一个点,用一条红边将它与新点连接:2.将新点放在一条红边上,新点与这条红边两端点直接的 ...

  5. 洛谷 P3647 [APIO2014]连珠线(换根 dp)

    题面传送门 题意: 桌子上有 \(1\) 个珠子,你要进行 \(n-1\) 次操作,每次操作有以下两种类型: 拿出一个新珠子,并选择一个桌子上的珠子,在它们之间连一条红线 选择两个由红线相连的珠子 \ ...

  6. 【BZOJ3677】[Apio2014]连珠线 换根DP

    [BZOJ3677][Apio2014]连珠线 Description 在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做“连珠线”.不出所料,玩这个游戏只需要珠子和线,珠子从1到礼编号,线分为红色 ...

  7. [Bzoj3677][Apio2014]连珠线(树形dp)

    3677: [Apio2014]连珠线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 434  Solved: 270[Submit][Status] ...

  8. 题解 [APIO2014]连珠线

    题解 [APIO2014]连珠线 题面 解析 首先这连成的是一棵树啊. 并且\(yy\)一下,如果钦定一个根, 那么这上面的蓝线都是爸爸->儿子->孙子这样的,因为像下图这样的构造不出来: ...

  9. 【LG3647】[APIO2014]连珠线

    [LG3647][APIO2014]连珠线 题面 洛谷 题解 首先考虑一下蓝线连起来的情况,一定是儿子-父亲-另一个儿子或者是儿子-父亲-父亲的父亲. 而因为一开始只有一个点在当前局面上,将一条红边变 ...

随机推荐

  1. VuePress config All In One

    VuePress config All In One docs/.vuepress/config.js const { title, description, } = require('../../p ...

  2. vue stop event bug

    vue stop event bug [Vue warn]: Error in v-on handler: "TypeError: e.prevntDefault is not a func ...

  3. Google coding Style Guide : Google 编码风格/代码风格 手册/指南

    1 1 1 https://github.com/google/styleguide Google 编码风格/代码风格 手册/指南 Style guides for Google-originated ...

  4. prototype chain & prototype & __proto__

    prototype chain & prototype & proto prototype chain MDN https://developer.mozilla.org/en-US/ ...

  5. Baccarat凭什么能成为DeFi后时代火爆新趋势?

    在各币种经历涨涨跌跌以后,DeFi后时代已然来临.那么,当前DeFi市场中哪个项目更被市场生态建设者看好呢?毫无疑问,Baccarat会成为最被看好的DeFi项目. Baccarat采用了独特的共识算 ...

  6. Baccarat流动性挖矿的收益能否持续?该如何参与Baccarat流动性挖矿?

    2020年DeFi市场火热,众多投资机构纷纷入场,分享这场资本盛宴.然而,目前市面上大多数DeFi项目手续费高昂,小资金的投资者无法入市.为了让更多的用户参与其中,NGK推出了Baccarat流动性挖 ...

  7. Windows Server2012 r2 nginx反向代理图片服务器

    1.下载nginx  http://nginx.org/en/download.html,本人下载的1.18.0版本 2.下载 Windows Service Wrapper(winsw.exe) v ...

  8. JIT原理

    本文转载自JVM杂谈之JIT 导语 JIT技术是JVM中最重要的核心模块之一.我的课程里本来没有计划这一篇,但因为不断有朋友问起,Java到底是怎么运行的?既然Hotspot是C++写的,那Java是 ...

  9. Dockerfile多阶段构建原理和使用场景

    本文转载自Dockerfile多阶段构建原理和使用场景 导语 Docker 17.05版本以后,新增了Dockerfile多阶段构建.所谓多阶段构建,实际上是允许一个Dockerfile 中出现多个 ...

  10. 读懂框架设计的灵魂—Java反射机制

    尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 CS-Wiki(Gitee 官 ...