[Bzoj3677][Apio2014]连珠线(树形dp)
3677: [Apio2014]连珠线
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 434 Solved: 270
[Submit][Status][Discuss]
Description
在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做“连珠线”。不出所料,玩这个游戏只需要珠子和线,珠子从1到礼编号,线分为红色和蓝色。游戏
开始时,只有1个珠子,而接下来新的珠子只能通过线由以下两种方式被加入:
1.Append(w,杪):-个新的珠子w和一个已有的珠子杪连接,连接使用红线。
2.Insert(w,u,v):-个新的珠子w加入到一对通过红线连接的珠子(u,杪)
之间,并将红线改成蓝线。也就是将原来u连到1的红线变为u连到w的蓝线与W连到V的蓝线。
无论红线还是蓝线,每条线都有一个长度。而在游戏的最后,将得到游戏的
最后得分:所有蓝线的长度总和。
现在有一个这个游戏的最终结构:你将获取到所有珠子之间的连接情况和所
有连线的长度,但是你并不知道每条线的颜色是什么。
你现在需要找到这个结构下的最大得分,也就是说:你需要给每条线一个颜
色f红色或蓝色),使得这种连线的配色方案是可以通过上述提到的两种连线方式
操作得到的,并且游戏得分最大。在本题中你只需要输出最大的得分即可。
Input
第一行是一个正整数n,表示珠子的个数,珠子编号为1刭n。
接下来n-l行,每行三个正整数ai,bi(l≤ai10000),表示有一条长度为ci的线连接了珠子ai和珠子bi。
Output
输出一个整数,为游戏的最大得分。
Sample Input
Sample Output
HINT
数据范围满足1≤n≤200000。
分析:
一开始以为定义状态f[i][0/1]表示第i个点是不是中心点乱树形dp就可以了,结果考完只有10分
AC代码:
# include <iostream>
# include <cstdio>
using namespace std;
const int N = 3e5 + ;
const int inf = 0x3f3f3f3f;
int head[N],dt,n,ans,f1[N],f2[N],g[N];
struct Edge{
int to,nex,w;
}edge[N << ];
void AddEdge(int u,int v,int w)
{
edge[++dt] = (Edge){v,head[u],w};
head[u] = dt;
}
void dfs(int u,int pre)
{
f1[u] = f2[u] = -inf;int t;
for(int i = head[u];i;i = edge[i].nex)
{
if(edge[i].to == pre)continue;
dfs(edge[i].to,u);
t = g[edge[i].to] + edge[i].w - max(g[edge[i].to],g[edge[i].to] + f1[edge[i].to] + edge[i].w);
if(t > f1[u])f2[u] = f1[u],f1[u] = t;
else if(t > f2[u])f2[u] = t;
g[u] += max(g[edge[i].to],g[edge[i].to] + f1[edge[i].to] + edge[i].w);
}
}
void Dfs(int u,int pre)
{
ans = max(ans,g[u]);int s,t,c;
for(int i = head[u];i;i = edge[i].nex)
{
if(edge[i].to == pre)continue;
s = g[u] - max(g[edge[i].to],g[edge[i].to] + f1[edge[i].to] + edge[i].w);
t = g[edge[i].to] + edge[i].w - max(g[edge[i].to],g[edge[i].to] + f1[edge[i].to] + edge[i].w);
if(f1[u] == t)c = f2[u];else c = f1[u];
g[edge[i].to] += max(s,s + c + edge[i].w);
t = s + edge[i].w - max(s,s + c + edge[i].w);
if(t > f1[edge[i].to])f2[edge[i].to] = f1[edge[i].to],f1[edge[i].to] = t;
else if(t > f2[edge[i].to])f2[edge[i].to] = t;
Dfs(edge[i].to,u);
}
}
int main()
{
freopen("beads.in","r",stdin);
freopen("beads.out","w",stdout);
scanf("%d",&n);int x,y,z;
for(int i = ;i < n;i++)
{
scanf("%d %d %d",&x,&y,&z);
AddEdge(x,y,z);AddEdge(y,x,z);
}
dfs(,-);Dfs(,-);
printf("%d\n",ans);
fclose(stdin);
fclose(stdout);
return ;
}
[Bzoj3677][Apio2014]连珠线(树形dp)的更多相关文章
- bzoj3677: [Apio2014]连珠线
Description 在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做“连珠线”.不出所料,玩这个游戏只需要珠子和线,珠子从1到礼编号,线分为红色和蓝色.游戏 开始时,只有1个珠子,而接下来新的 ...
- 【BZOJ3677】[Apio2014]连珠线 换根DP
[BZOJ3677][Apio2014]连珠线 Description 在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做“连珠线”.不出所料,玩这个游戏只需要珠子和线,珠子从1到礼编号,线分为红色 ...
- 题解 [APIO2014]连珠线
题解 [APIO2014]连珠线 题面 解析 首先这连成的是一棵树啊. 并且\(yy\)一下,如果钦定一个根, 那么这上面的蓝线都是爸爸->儿子->孙子这样的,因为像下图这样的构造不出来: ...
- 【LG3647】[APIO2014]连珠线
[LG3647][APIO2014]连珠线 题面 洛谷 题解 首先考虑一下蓝线连起来的情况,一定是儿子-父亲-另一个儿子或者是儿子-父亲-父亲的父亲. 而因为一开始只有一个点在当前局面上,将一条红边变 ...
- bzoj 3677: [Apio2014]连珠线【树形dp】
参考:http://www.cnblogs.com/mmlz/p/4456547.html 枚举根,然后做树形dp,设f[i][1]为i是蓝线中点(蓝线一定是父子孙三代),f[i][0]为不是,转移很 ...
- 洛谷 P3647 [APIO2014]连珠线(换根 dp)
题面传送门 题意: 桌子上有 \(1\) 个珠子,你要进行 \(n-1\) 次操作,每次操作有以下两种类型: 拿出一个新珠子,并选择一个桌子上的珠子,在它们之间连一条红线 选择两个由红线相连的珠子 \ ...
- APIO2014 连珠线
题目链接:戳我 换根DP 由于蒟蒻不会做这个题,所以参考了大佬. 本来想的是有三种情况,一种是该节点不作为两个蓝线的中点(我们称这种不是关键节点),一种是该节点作为关键点.连两个子节点,一种是作为关键 ...
- 洛谷$P3647\ [APIO2014]$连珠线 换根$dp$
正解:换根$dp$ 解题报告: 传送门! 谁能想到$9102$年了$gql$居然还没写过换根$dp$呢,,,$/kel$ 考虑固定了从哪个点开始之后,以这个点作为根,蓝线只可能是直上直下的,形如&qu ...
- 并不对劲的bzoj3677:p3647:[APIO2014]连珠线
题目大意 有一种生成\(n\)个点的树的方法为: 一开始有一个点,\(n-1\)次操作,每次可以有两种操作:1.选一个点,用一条红边将它与新点连接:2.将新点放在一条红边上,新点与这条红边两端点直接的 ...
随机推荐
- webuploader项目中多图片上传实例
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 解析IPV4报文 和IPV6 报文的 checksum
解析IPV4报文和IPV6报文的checksum的算法: 校验和(checksum)算法,简单的说就是16位累加的反码运算: 计算函数如下: 我们在计算时是主机字节序,计算的结果封装成IP包时是网络字 ...
- iOS 静态库,动态库与 Framework
iOS 静态库,动态库与 Framework 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢 ...
- Spring Boot + Mybatis + Druid 动态切换多数据源
在大型应用程序中,配置主从数据库并使用读写分离是常见的设计模式. 在Spring应用程序中,要实现读写分离,最好不要对现有代码进行改动,而是在底层透明地支持. 这样,就需要我们再一个项目中,配置两个, ...
- modprode
modprobe命令 1.modprobe 命令是根据depmod -a的输出/lib/modules/version/modules.dep来加载全部的所需要模块. 2.删除模块的命令是:modpr ...
- 《嵌入式linux应用程序开发标准教程》笔记——8.进程间通信
, 8.1 概述 linux里使用较多的进程间通信方式: 管道,pipe和fifo,管道pipe没有实体文件,只能用于具有亲缘关系的进程间通信:有名管道 named pipe,也叫fifo,还允许无亲 ...
- hdu3594 Cactus
仙人掌入门简单题. 先看一篇文档. #include <iostream> #include <cstring> #include <cstdio> using n ...
- 【LeetCode】Unique Email Addresses(独特的电子邮件地址)
这道题是LeetCode里的第929道题. 题目要求: 每封电子邮件都由一个本地名称和一个域名组成,以 @ 符号分隔. 例如,在 alice@leetcode.com中, alice 是本地名称,而 ...
- Thread.getContextClassLoader() is null
Java threads created from JNI code in a non-java thread have null ContextClassloader unless the crea ...
- iOS学习笔记22-推送通知
一.推送通知 推送通知就是向用户推送一条信息来通知用户某件事件,可以在应用退到后台后,或者关闭后,能够通过推送一条消息通知用户某件事情,比如版本更新等等. 推送通知的常用应用场景: 一些任务管理APP ...