标签:树形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;
}

  

最新文章

  1. Python 各进制间的转换(转)
  2. iOS原生地图开发指南续——大头针与自定义标注
  3. 错误 未能找到类型或命名空间名称 (是否缺少 using 指令或程序集引用?)
  4. MFC CString to char* (Visual Studio 2015 亲测可用)
  5. DICOM:DICOM3.0网络通信协议
  6. python小程序:无限求和平均
  7. netty中LengthFieldBasedFrameDecoder的使用
  8. IntelliJ IDEA 13破解(JRebel 5.6.3a破解)
  9. java 格式化代码 不进行换行
  10. 每天一个小算法(Shell Sort3)
  11. ASP.NET中Request.ApplicationPath、Request.FilePath、Request.Path、.Request.MapPath、Server.MapPath(转载)
  12. Winxp下搭建SVN服务器
  13. JQuery.validate在ie8下不支持解决方案
  14. .NET 4.0里异常处理的新机制
  15. 批处理文件:windows下关闭指定端口
  16. [三]基础数据类型之Integer详解
  17. OC对象,自动释放池,OC与C语言的区别
  18. SpringBoot-06:SpringBoot增删改查一套完整的考试案例
  19. 【转】python虚拟环境--virtualenv
  20. position 有五个值:static、relative、absolute、fixed、inherit。

热门文章

  1. LeetCode 5274. Number of Ways to Stay in the Same Place After Some Steps - Java - DP
  2. QT5的QChart使用记录
  3. C++实现 企业信息管理系统
  4. swift版 二分查找 (折半查找)
  5. Windows 上的应用程序在运行期间可以给自己改名(可以做 OTA 自我更新)
  6. EgretWing链接微信开发工具调试问题
  7. integer 面试题。
  8. 1+X证书学习日志——javascript基础
  9. react diff
  10. CSS 滑动门案例