参考: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】的更多相关文章

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

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

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

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

  3. 题解 [APIO2014]连珠线

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

  4. [BZOJ 4033] [HAOI2015] T1 【树形DP】

    题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...

  5. 【LG3647】[APIO2014]连珠线

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

  6. [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)

    [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...

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

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

  8. bzoj3677: [Apio2014]连珠线

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

  9. APIO2014 连珠线

    题目链接:戳我 换根DP 由于蒟蒻不会做这个题,所以参考了大佬. 本来想的是有三种情况,一种是该节点不作为两个蓝线的中点(我们称这种不是关键节点),一种是该节点作为关键点.连两个子节点,一种是作为关键 ...

随机推荐

  1. ubuntu-12.04下安装postgresql

    2013-10-01 20:42:57|    moniter参考资料:Ubuntu 12.04下PostgreSQL-9.1安装与配置详解(在线安装)一.安装postgresqlbamboo@bam ...

  2. 洛谷——P1546 最短网络 Agri-Net

    P1546 最短网络 Agri-Net 题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 题目描述 约翰已经给他的农场安排了一 ...

  3. js的offsetWidth,clientWidth

    js元素的offsetWidth与clientWidth很相似,因此放在一起记录. clientWidth与offsetWidth clientWidth=元素内容区域宽度+水平内边距padding. ...

  4. POJ 1797 【一种叫做最大生成树的很有趣的贪心】【也可以用dij的变形思想~】

    题意: 给一个无向图,找1到n所有的路中每条路最小权值的最大值! 屌丝一开始的思想是利用dij的变形~ 但是==屌丝忘记了更新dis数组~结果TLE无数次... 说正经的~dij的变形思想是这样的if ...

  5. java数据结构和算法09(哈希表)

    树的结构说得差不多了,现在我们来说说一种数据结构叫做哈希表(hash table),哈希表有是干什么用的呢?我们知道树的操作的时间复杂度通常为O(logN),那有没有更快的数据结构?当然有,那就是哈希 ...

  6. vs npm设置淘宝npm

    VS2017自带的npm会去国外的镜像下载文件, 奇慢无比, 还是马云家淘宝的镜像适合国内用户. 淘宝npm镜像地址:  https://registry.npm.taobao.org VS中使用淘宝 ...

  7. Weblogic性能优化(图解)

    分类:Weblogic (2034) (1) 若是觉得对您有一丢丢的帮助,烦请顶一下哦,激励我码出更多的帖子,^_^谢谢! 1.数据源性能优化 1.1连接池参数配置 登录weblogic控制台,占击“ ...

  8. 【Git使用具体解释】Egit的经常使用操作具体解释

    经常使用操作 操作 说明 Fetch 从远程获取最新版本号到本地,不会自己主动merge Merge 能够把一个分支标签或某个commit的改动合并如今的分支上 Pull 从远程获取最新版本号并mer ...

  9. [React] Extend styles with styled-components in React

    In this lesson, you will learn how to extend styles from one styled-component to another in a React ...

  10. Material UI:很强大的CSS框架

    Material UI 是一款功能很强大,界面却十分清新简洁的CSS框架.Material UI利用了Google的Material Design 全新设计语言.而且让每个UI组件都变得很独立.因此开 ...