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 由于蒟蒻不会做这个题,所以参考了大佬. 本来想的是有三种情况,一种是该节点不作为两个蓝线的中点(我们称这种不是关键节点),一种是该节点作为关键点.连两个子节点,一种是作为关键 ...
随机推荐
- Help him--hdu5059(模拟 大坑)
http://acm.hdu.edu.cn/showproblem.php?pid=5059 直接说可能出现的情况 #include <iostream> #include <cst ...
- The Bottom of a Graph
poj——The Bottom of a Graph Time Limit: 3000MS Memory Limit: 65536K ...
- eclipse默认指定项目的编译器版本
eclipse 提示 @Override must override a superclass method 问题解决 今天新换了一个Eclipse 版本: Build id: 20140224-06 ...
- LoadRunner系列之—-01 接口压力测试脚本
LoadRunner中一般用如下函数进行接口测试: <一>. http或soap协议下的get请求接口,样例如下: web_url("integrated_query.jsp&q ...
- HTML5开发实战——Sencha Touch篇(1)
学习了很多主要的Sencha Touch内容,已经了解了Sencha Touch的开发模式.接下来一段时间我们将利用Sencha Touch来进行自己的web应用构建. 先要解决的是前端的问题.从最简 ...
- 【iOS系列】-iOS查看沙盒文件图文教程(真机+模拟器)
[iOS系列]-iOS查看沙盒文件图文教程(真机+模拟器) 1:模拟器 1.1 方法1: 程序中打印一下的地址,能直接前往沙盒路径. NSString *path = [NSSearchPathFor ...
- setTimeout不可靠的修正办法及clearTimeout
javascript里的这两个定时器函数,大家一定耳熟能详: setTimeout("函数()",毫秒)就是开启一个计时器,指定毫秒后执行该函数一次. 有关定时器,javascri ...
- TCP协议,UDP协议
帅爆太阳的男人 1,TCP协议 回环地址:127.0.0.1(所有电脑都这一个默认回环地址)每个计算机都有这么一个本机地址只能被本机识别,不会被其他机器识别(因为你用这个地址传内容他就传不出去) TC ...
- jQuery - AJAX 级联变动
此篇文章主要是用来记忆使用JQUERY+AJAX技术实现 二级级联变动 : 当第一个下拉框变动时,第二个下拉列表框中也将会随之变动. JSP: ---------------------------- ...
- Avoiding memory leaks
Android applications are, at least on the T-Mobile G1, limited to 16 MB of heap. It's both a lot of ...