这题刚了好久的treedp,一直WA比较大的点,不知道哪里错了以为我想法错了看题解结果都说换根好做些不换根很多特殊情况….
咱觉得咱的想法没问题..,应该是一些细节没考虑好,又想了想一些反例就过去了

题解部分:
最终答案选的蓝边一定是若干组相邻的树边,用中间点统计和,考虑什么样的分组是合法的
以下给出一些反例:


不合法的情况很多,但可以根据加点的2种方法,总结成以下的东西:

设一组蓝边为(x,y)-(y,z),加边顺序为(x,z) -> (x,y)-(y.z)
后加入的点z是为了制造这两条边分配给x的,他被分配给这一组后就被这组“占用”了
生成的中间点y被这组占用
两个点(x,z)之间直接连边要占用其中一个点
一个点只能至多被占用一次

其实“占用”就相当于不断往原图加点的过程

用这个东西就可以不换根dp啦

设f[i][0/1/2/3],
f[i][0]表示点i未被占用/
f[i][1]表示点i是作为一组蓝边的中间点y,连接了i的某2个孩子/
f[i][2]表示i作为一组蓝边的中间点,连接了y的某个未被占用的孩子和y的父亲/
f[i][3]表示i作为一组蓝边的中间点,连接了y的某个被占用的孩子和y的父亲

i的子树的最大蓝边和

转移的时候有一些关于占用的细节这里不细讲了
其实code写的不长压

code:

#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<cmath>
#include<ctime>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<complex>
#include<iostream>
#include<algorithm>
#define ll long long
#define inf 1e9
using namespace std;const int maxn = 210000;
int mx(int a,int b,int c){return max(max(a,b),c);}int n;
struct edge{int y,c,nex;}a[maxn<<1]; int len,fir[maxn];
inline void ins(const int x,const int y,const int c){a[++len]=(edge){y,c,fir[x]};fir[x]=len;}int d[maxn],fa[maxn];
int f[maxn][4],g[maxn],f0,f1,f2,f3;
void dp(const int x,const int c)
{for(int k=fir[x],y=a[k].y;k;k=a[k].nex,y=a[k].y) if(y!=fa[x]){d[x]++,fa[y]=x;dp(y,a[k].c);f[x][1]=max(f[x][1]+max(f[y][0],f[y][2]),f[x][0]+g[y]);f[x][0]+=max(f[y][0],f[y][2]);}if(d[x]>=2){f0=0; f1=f2=f3=-inf;for(int k=fir[x],y=a[k].y;k;k=a[k].nex,y=a[k].y) if(y!=fa[x]){int c0=max(f[y][0],f[y][2]),c1=f[y][1]+a[k].c,c2=f[y][0]+a[k].c,c3=max(c1,c2);f3=mx(f3+c0,f2+c3,f1+c2);f2=max(f2+c0,f0+c2);f1=max(f1+c0,f0+c1);f0+=c0;}f[x][1]=max(f[x][1],f3);}if(d[x]&&x!=1){f0=0; f1=f2=-inf;for(int k=fir[x],y=a[k].y;k;k=a[k].nex,y=a[k].y) if(y!=fa[x]){int c0=max(f[y][0],f[y][2]),c1=f[y][1]+a[k].c,c2=f[y][0]+a[k].c;f2=max(f2+c0,f0+c2);f1=max(f1+c0,f0+c1);f0+=c0;}f[x][2]=f2+c,f[x][3]=f1+c;}g[x]=max(max(f[x][0],f[x][1]),max(f[x][2],f[x][3]));
}int main()
{scanf("%d",&n);for(int i=1;i<n;i++){int x,y,c; scanf("%d%d%d",&x,&y,&c);ins(x,y,c); ins(y,x,c);}dp(1,0);printf("%d\n",max(f[1][0],f[1][1]));return 0;
}

BZOJ3677: [Apio2014]连珠线相关推荐

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

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

  2. 洛谷P3647 [APIO2014] 连珠线 题解

    洛谷P3647 [APIO2014] 连珠线 题解 题目链接:P3647 [APIO2014] 连珠线 题意: 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或 ...

  3. [APIO2014]连珠线

    题目链接 分析 首先考虑朴素算法. 可以枚举每个节点作为根,这样的话连接的树的形态就确定了. 应为我们可以知道每个点只可能是一个蓝边的中点,不难想到设一个DP状态表示节点是否为蓝边的中点,设 dp[i ...

  4. APIO2014 连珠线

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

  5. P3647 [APIO2014]连珠线

    题意 传送门 题解 我们发现,如果一棵树的形态固定了,那么蓝线的方向一定是son[x]-x-fa[x],那么我们就可以先随便定一个根进行DP. 我们设f[i][0]f[i][0]f[i][0]表示以i ...

  6. [APIO2014]连珠线 题解

    我们设初始的那个点为root.则所有的蓝色链都是形如father−now−sonfather-now-sonfather−now−son. 我们设计两个dp状态: dpi,0dp_{i,0}dpi,0 ...

  7. luogu P3647 [APIO2014] 连珠线

    https://www.luogu.com.cn/problem/P3647 我写DP像cxk 发现只有两种连边的方式 假设最优的策略已经给了出来,那么一定存在选定某个点为根的时候,只存在第一种脸边的 ...

  8. [BZOJ3677/UOJ#105][APIO2014]Beads and wires 连珠线(树形dp+换根)

    Address https://www.lydsy.com/JudgeOnline/problem.php?id=3677 http://uoj.ac/problem/105 Solution 考虑一 ...

  9. 红黑树如何快速调整到平衡态_快速多态

    红黑树如何快速调整到平衡态 进阶主题 (Advanced Topic) Object-Oriented Programming has ruled the programming world for ...

最新文章

  1. 独家 | 如何“扰乱”科技巨头用来监视你的数据
  2. 确定NTFS权限应用的位置
  3. 单片机流星灯_51单片机拖尾灯实现
  4. Idea中启动tomcat服务,提示缺少一个tcnative-1.dll文件
  5. [转]仿163网盘无刷新文件上传系统
  6. 百度语音识别rest html,delphi调用百度语音识别REST API(示例代码)
  7. Java 从网络上下载文件
  8. 如何使用MAT进行JVM内存泄露分析
  9. sh(Spring+Spring mvc+hibernate)——BaseDao.java
  10. 快照速度_网络推广——网络推广专员如何看待网站快照更新快慢问题?
  11. 三角形外接球万能公式_秒杀三角形问题!!三角形分角线的几个重要结论及其应用...
  12. c语言编写的贪吃蛇代码,刚学C语言,想写一个贪吃蛇的代码
  13. ZeroClipboard实现复制
  14. 恢复数据的原理和方法
  15. chromium浏览器_轻松下载便携式Chromium浏览器
  16. firefox金山词霸取词
  17. Ubuntu18.04 打不开系统蓝牙适配器,也连接不上任何蓝牙设备Bug解决方案
  18. webrtc thread introduce
  19. 【压力测试 2】JMeter压力测试之Internal server error 500 问题解决思路
  20. OPT液态镜头上市,视觉检测实现瞬时对焦

热门文章

  1. Paddle-GPU环境配置问题解决总结 Error: Cannot load cudnn shared library. Cannot invoke method cudnnGetVersion
  2. iOS VIPER 架构解读
  3. 现代化综治网格管理模式——织网工程
  4. 获取网站后台权限理解
  5. git push 失败问题如何解决
  6. 华为手机如何设置主页面_华为手机怎么返回主界面
  7. 【考生说】负重前行的道路上一直都需要一个自律的你
  8. ScriptX.cab与Smsx.cab打印代码
  9. 马云接班人为什么是张勇?
  10. module和package是什么