BZOJ 4890: [Tjoi2017]城市 树形dp
标签:树形dp,枚举,树的直径
一上来看到这个题就慌了,只想到了 $O(n^3)$ 的做法.
碰到这种题时要一步一步冷静地去分析,观察数据范围.
首先,$n\leqslant 5000$,所以可以先 $O(n)$ 枚举切断哪条边.
而如果暴力枚举连哪条边的话时间就是爆炸的,不妨冷静地分类讨论一下.
当断掉这条边后,就形成了两个小树.
那么,新树的直径无外乎只有 2 种情况:两个小树中直径的较大值(只经过一棵树的点)/经过两棵树的点.
对于第一种情况,当我们断掉这条边时就是确定好的,可以直接 O(n) 算.
而对于第二种情况,既然是每棵树都要经过一些点,不妨选择每棵树中延伸长度最小的直接连上.
由于这两种情况都是互不影响的,所以可以直接取最小值.
冷静分析,分类讨论.
#include <bits/stdc++.h>
using namespace std;
#define setIO(s) freopen(s".in","r",stdin)
const int N=5010;
int n,cnt=1,ans=453533453,tmp;
int hd[N],to[N<<1],nex[N<<1],dis[N<<1],f[N],g[N],maxson[N],check[N<<1],val[N<<1];
inline void add(int u,int v,int c)
{
nex[++cnt]=hd[u],hd[u]=cnt,to[cnt]=v,val[cnt]=c;
}
void dfs1(int u,int ff)
{
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(v==ff||check[i]) continue;
dfs1(v,u);
tmp=max(tmp,f[u]+f[v]+val[i]);
if(f[v]+val[i]>f[u]) g[u]=f[u],f[u]=f[v]+val[i],maxson[u]=v;
else if(f[v]+val[i]>g[u]) g[u]=f[v]+val[i]; }
}
void dfs2(int x,int ff,int maxx)
{
tmp=min(tmp,max(maxx,f[x]));
for(int i=hd[x];i;i=nex[i])
{
int v=to[i];
if(v==ff||check[i]) continue;
if(maxson[x]==v) dfs2(v,x,max(g[x]+val[i],maxx+val[i]));
else dfs2(v,x,max(f[x]+val[i],maxx+val[i]));
}
}
inline void init()
{
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
memset(maxson,0,sizeof(maxson));
}
int main()
{
// setIO("input");
int i,j;
scanf("%d",&n);
for(i=1;i<n;++i)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w),add(v,u,w);
}
for(i=2;i<=cnt;i+=2)
{
init();
int d1,d2,d3,d4,x=to[i],y=to[i^1];
check[i]=check[i^1]=1;
tmp=0, dfs1(x,0), d1=tmp;
tmp=0, dfs1(y,0), d2=tmp;
tmp=10000000, dfs2(x,0,0), d3=tmp;
tmp=10000000, dfs2(y,0,0), d4=tmp;
ans=min(ans,max(max(d1,d2),d3+d4+val[i]));
check[i]=check[i^1]=0;
}
printf("%d\n",ans);
return 0;
}
BZOJ 4890: [Tjoi2017]城市 树形dp的更多相关文章
- [BZOJ 4890][TJOI2017]城市
传送门 $ \color{green} {solution : }$ 我们可以暴力枚举断边,然后 $ O(n) $ 的跑一次换根 $ dp $,然后复杂度是 $ O(n * n) $ 的 #inclu ...
- Bzoj 1131[POI2008]STA-Station (树形DP)
Bzoj 1131[POI2008]STA-Station (树形DP) 状态: 设\(f[i]\)为以\(i\)为根的深度之和,然后考虑从他父亲转移. 发现儿子的深度及其自己的深度\(-1\) 其余 ...
- BZOJ 4726: [POI2017]Sabota? 树形dp
4726: [POI2017]Sabota? 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4726 Description 某个公司有n ...
- bzoj 2286(虚树+树形dp) 虚树模板
树链求并又不会写,学了一发虚树,再也不虚啦~ 2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 5002 Sol ...
- BZOJ 4472 [Jsoi2015]salesman(树形DP)
4472: [Jsoi2015]salesman Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 417 Solved: 192[Submit][St ...
- bzoj 3829: [Poi2014]FarmCraft 树形dp+贪心
题意: $mhy$ 住在一棵有 $n$ 个点的树的 $1$ 号结点上,每个结点上都有一个妹子. $mhy$ 从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装 $zhx$ 牌杀毒 ...
- BZOJ 1369: [Baltic2003]Gem(树形dp)
传送门 解题思路 直接按奇偶层染色是错的,\(WA\)了好几次,所以要树形\(dp\),感觉最多\(log\)种颜色,不太会证. 代码 #include<iostream> #includ ...
- bzoj 3743 [Coci2015]Kamp——树形dp+换根
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. “从根出发又回到根” 减去 “mx ” . 注意dfsx里真的要改那 ...
- BZOJ 1812: [Ioi2005]riv( 树形dp )
树背包, 左儿子右兄弟来表示树, dp(x, y, z)表示结点x, x的子树及x的部分兄弟共建y个伐木场, 离x最近的伐木场是z时的最小代价. 时间复杂度O(N^2*K^2) ----------- ...
随机推荐
- STM8L052C6T6液晶LCD驱动过程
首先还是必要的说明,鄙人经验有限,如发现问题还请不吝赐教,反馈到邮箱mr.li.ming@qq.com 使用的液晶屏 单片机引脚 液晶的COM1-COM4分别对应单片机LCD_COM0-LCD_COM ...
- 使用PHP开发HR系统(3)
本节我们讲述如何创建主页. ====================================================================================== ...
- python之数据解构和算法进阶
1.解压赋值多个变量 采用解构的方法.可迭代对象才可以,变量数量与元素个数要一一对应,或者采用*万能接收. 2.解压可迭代对象赋值多个变量 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 Va ...
- Unity - 简单实现音频管理系统
简单实现Unity音频管理脚本,便于长短音频的播放控制和音量控制等,核心方法为对象池的应用. 项目地址:AudioPlay - SouthBegonia 包含方法: 持有所有 AudioSource ...
- web API .net - .net core 对比学习-文件目录概述
个人正在学习.net web Api的相关知识,因此用这一系列博客做一记录. 1. 首先我们分别创建 .net web api 项目和 .net core web api 项目. 2. 我们首先比较一 ...
- 2019 魔域java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.魔域等公司offer,岗位是Java后端开发,因为发展原因最终选择去了魔域,入职一年时间了,也成为了面试官,之 ...
- 2019 快乐阳光java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.快乐阳光等公司offer,岗位是Java后端开发,最终选择去了快乐阳光. 面试了很多家公司,感觉大部分公司考察的点 ...
- 又一个js乱码的秘密alert放在js文件里中文乱码,可是放在HTML里显示中文就很好
用文本文档打开你的js文件,文件-另存为,编码更改为UTF-8保存. 回复 | PFly | 园豆:94 (初学一级) | 2017-07-17 21:32 显示结果中文乱码 支持(0)反对(0)回复 ...
- JAVA项目之注册
public class RegisterServlet extends HttpServlet { private UsersService usersService = new UsersServ ...
- DEDECMS文章标题显示不全的原因以及解决方法
首先这里说一下编码问题:UTF-8与GBK(通常为GB2312). GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准):GBK编码专门用来解决中文编码的,是双字节的 ...