bzoj 3677: [Apio2014]连珠线【树形dp】
参考:http://www.cnblogs.com/mmlz/p/4456547.html
枚举根,然后做树形dp,设f[i][1]为i是蓝线中点(蓝线一定是父子孙三代),f[i][0]为不是,转移很好想,但是这是n方的
考虑优化换根,记录最小值和最大值就能换根了
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=1000005,inf=1e9;
int n,h[N],cnt,f[N][2],fa[N],va[N],ans;
vector<int>s[N],g[N][2],b[N];
struct qwe
{
int ne,to,va;
}e[N];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
inline void add(int u,int v,int w)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
e[cnt].va=w;
h[u]=cnt;
}
inline void ud(int x)
{
if(x>ans)
ans=x;
}
void dfs(int u)
{
f[u][1]=-inf,f[u][0]=0;
int fb=-inf,sb=-inf;
for(int i=h[u];i;i=e[i].ne)
if(e[i].to!=fa[u])
{
va[e[i].to]=e[i].va;
fa[e[i].to]=u;
dfs(e[i].to);
f[u][0]+=max(f[e[i].to][0],f[e[i].to][1]+e[i].va);
int now=-max(f[e[i].to][0],f[e[i].to][1]+e[i].va)+f[e[i].to][0]+e[i].va;
if(now>fb)
sb=fb,fb=now;
else if(now>sb)
sb=now;
}
f[u][1]=f[u][0]+fb;
for(int i=h[u];i;i=e[i].ne)
if(e[i].to!=fa[u])
{
int tmp=f[u][0]-max(f[e[i].to][0],f[e[i].to][1]+e[i].va),key;
s[u].push_back(e[i].to);
g[u][0].push_back(tmp);
if(-max(f[e[i].to][0],f[e[i].to][1]+e[i].va)+f[e[i].to][0]+e[i].va==fb)
key=sb;
else
key=fb;
g[u][1].push_back(tmp+key);
b[u].push_back(key);
}
}
void dp(int u)
{
for(int i=0,len=s[u].size();i<len;i++)
{
f[u][0]=g[u][0][i];
f[u][1]=g[u][1][i];
if(fa[u])
{
f[u][0]+=max(f[fa[u]][0],f[fa[u]][1]+va[u]);
f[u][1]=f[u][0];
int key=max(b[u][i],-max(f[fa[u]][0],f[fa[u]][1]+va[u])+f[fa[u]][0]+va[u] );
f[u][1]+=key;
}
ud(f[s[u][i]][0]+max(f[u][0],f[u][1]+va[s[u][i]]));
dp(s[u][i]);
}
}
int main()
{
n=read();
for(int i=1;i<n;i++)
{
int x=read(),y=read(),z=read();
add(x,y,z),add(y,x,z);
}
dfs(1);
ud(f[1][0]);
dp(1);
printf("%d\n",ans);
return 0;
}
bzoj 3677: [Apio2014]连珠线【树形dp】的更多相关文章
- [Bzoj3677][Apio2014]连珠线(树形dp)
3677: [Apio2014]连珠线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 434 Solved: 270[Submit][Status] ...
- 【BZOJ3677】[Apio2014]连珠线 换根DP
[BZOJ3677][Apio2014]连珠线 Description 在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做“连珠线”.不出所料,玩这个游戏只需要珠子和线,珠子从1到礼编号,线分为红色 ...
- 题解 [APIO2014]连珠线
题解 [APIO2014]连珠线 题面 解析 首先这连成的是一棵树啊. 并且\(yy\)一下,如果钦定一个根, 那么这上面的蓝线都是爸爸->儿子->孙子这样的,因为像下图这样的构造不出来: ...
- [BZOJ 4033] [HAOI2015] T1 【树形DP】
题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...
- 【LG3647】[APIO2014]连珠线
[LG3647][APIO2014]连珠线 题面 洛谷 题解 首先考虑一下蓝线连起来的情况,一定是儿子-父亲-另一个儿子或者是儿子-父亲-父亲的父亲. 而因为一开始只有一个点在当前局面上,将一条红边变 ...
- [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)
[BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...
- 洛谷 P3647 [APIO2014]连珠线(换根 dp)
题面传送门 题意: 桌子上有 \(1\) 个珠子,你要进行 \(n-1\) 次操作,每次操作有以下两种类型: 拿出一个新珠子,并选择一个桌子上的珠子,在它们之间连一条红线 选择两个由红线相连的珠子 \ ...
- bzoj3677: [Apio2014]连珠线
Description 在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做“连珠线”.不出所料,玩这个游戏只需要珠子和线,珠子从1到礼编号,线分为红色和蓝色.游戏 开始时,只有1个珠子,而接下来新的 ...
- APIO2014 连珠线
题目链接:戳我 换根DP 由于蒟蒻不会做这个题,所以参考了大佬. 本来想的是有三种情况,一种是该节点不作为两个蓝线的中点(我们称这种不是关键节点),一种是该节点作为关键点.连两个子节点,一种是作为关键 ...
随机推荐
- iOS present出一个背景为半透明的试图
WDKChatRoomViewController *roomVC = [[WDKChatRoomViewController alloc] init]; roomVC.titleStr = [gro ...
- 创建SSH keys
1.检查是否已经有SSH Key存在 windows: type "%userprofile%\.ssh\id_rsa.pub" Linux: cat ~/.ssh/id_rsa. ...
- HDU 6397 组合数学+容斥 母函数
Character Encoding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Oth ...
- ACM常用模板整理
线段树单点修改区间查询 #include<stdio.h> #include<string.h> #include<algorithm> using namespa ...
- poj——3118 Arbiter
Arbiter 题目描述: “仲裁者”是<星际争霸>科幻系列中的一种太空船.仲裁者级太空船是神族的战船,专门提供精神力支援.不像其他战船的人员主要是战士阶级,仲裁者所承载的都 ...
- Spring Data Redis配置项有多少(不列举具体,只提供找的方法)
首先,要说明Spring Data Redis集成了很多款客户端,比如Jedis这些. 而如果在注入Bean时,我们一般是可以设置一些项的,比如hostName和port等,对于这些项一般的查找方式通 ...
- 【.Net Core 学习系列】-- EF Core实践(DB First)
一.开发环境: VS2015, .Net Core 1.0.0-preview2-003156 二.准备数据: CREATE DATABASE [Blogging]; GO USE [Blogging ...
- 我的Android Studio 优化之路
改动keymap 改动经常使用的快捷键 代码补全(Eclipse: ALT+/) Android Studio中默认用的是Ctrl+Space, 这跟输入法切换冲突.找到Keymap->Main ...
- POJ 1436 Horizontally Visible Segments(线段树)
POJ 1436 Horizontally Visible Segments 题目链接 线段树处理染色问题,把线段排序.从左往右扫描处理出每一个线段能看到的右边的线段,然后利用bitset维护枚举两个 ...
- ascii与unicode,utf-8小结
ascii是以一个字节存储英文和特殊字符,不支持中文的处理.unicode占用的是两个字节,可以存储中文.utf-8占用三个字节,可以根据存储的内容进行中英文的转换. Python的解释器是不支持中文 ...