要求最大值最小容易想到二分答案。首先对每个点求出子树中与其最远的距离是多少,二分答案后就可以标记上一些必须在所选择路径中的点,并且这些点是不应存在祖先关系的。那么如果剩下的点数量>=3,显然该答案不可行;=0,显然可行;=1,由该点沿其到根的路径往上爬,并计算最远距离判断是否合法;=2,求出两点lca后与1的做法类似。

  noip原题是要求该路径在一条直径上,事实上这条最优路径一定是在直径上的,不过并不太懂这之间的关系。

  写的太丑于是常数巨大,bzoj上愉快的T掉了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. using namespace std;
  8. int read()
  9. {
  10. int x=,f=;char c=getchar();
  11. while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
  12. while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
  13. return x*f;
  14. }
  15. #define N 500010
  16. int n,m,p[N],deep[N],up[N],f[N],fa[N],t=,ans=,cnt,q[];
  17. struct data{int to,nxt,len;
  18. }edge[N<<];
  19. void addedge(int x,int y,int z){t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].len=z,p[x]=t;}
  20. void dfs(int k)
  21. {
  22. for (int i=p[k];i;i=edge[i].nxt)
  23. if (edge[i].to!=fa[k])
  24. {
  25. fa[edge[i].to]=k;
  26. deep[edge[i].to]=deep[k]+;
  27. up[edge[i].to]=edge[i].len;
  28. dfs(edge[i].to);
  29. f[k]=max(f[k],f[edge[i].to]+edge[i].len);
  30. }
  31. }
  32. void paint(int k,int x)
  33. {
  34. if (cnt>) return;
  35. for (int i=p[k];i;i=edge[i].nxt)
  36. if (edge[i].to!=fa[k])
  37. {
  38. paint(edge[i].to,x);
  39. if (cnt>) break;
  40. if (f[edge[i].to]+edge[i].len>x&&f[edge[i].to]<=x)
  41. q[++cnt]=edge[i].to;
  42. if (cnt>) break;
  43. }
  44. }
  45. bool check(int k)
  46. {
  47. cnt=;
  48. paint(,k);
  49. if (cnt>) return ;
  50. if (cnt==)
  51. {
  52. int x=q[],y=q[],len=;
  53. while (x!=y)
  54. {
  55. if (deep[x]<deep[y]) swap(x,y);
  56. len+=up[x],x=fa[x];
  57. }
  58. if (len>m) return ;
  59. len=;
  60. while (fa[x])
  61. {
  62. y=x,len+=up[x],x=fa[x];
  63. if (len>k) return ;
  64. for (int i=p[x];i;i=edge[i].nxt)
  65. if (edge[i].to!=y&&edge[i].to!=fa[x]&&f[edge[i].to]+edge[i].len+len>k) return ;
  66. }
  67. }
  68. if (cnt==)
  69. {
  70. int x=q[],y,len=,flag=;
  71. while (fa[x])
  72. {
  73. y=x,len+=up[x],x=fa[x];
  74. if (!flag&&len>m) flag=,len=up[y];
  75. if (len*flag>k) return ;
  76. for (int i=p[x];i;i=edge[i].nxt)
  77. if (edge[i].to!=y&&edge[i].to!=fa[x]&&f[edge[i].to]+edge[i].len+len*flag>k) return ;
  78. }
  79. }
  80. return ;
  81. }
  82. int main()
  83. {
  84. #ifndef ONLINE_JUDGE
  85. freopen("bzoj2282.in","r",stdin);
  86. freopen("bzoj2282.out","w",stdout);
  87. const char LL[]="%I64d\n";
  88. #else
  89. const char LL[]="%lld\n";
  90. #endif
  91. n=read(),m=read();
  92. int l=,r=;
  93. for (int i=;i<n;i++)
  94. {
  95. int x=read(),y=read(),z=read();r+=z;
  96. addedge(x,y,z),addedge(y,x,z);
  97. }
  98. dfs();
  99. while (l<=r)
  100. {
  101. int mid=l+r>>;
  102. if (check(mid)) ans=mid,r=mid-;
  103. else l=mid+;
  104. }
  105. cout<<ans;
  106. return ;
  107. }

BZOJ2282 SDOI2011消防/NOIP2007树网的核(二分答案+树形dp)的更多相关文章

  1. [SDOI2011]消防/[NOIP2007] 树网的核

    消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家最兴旺的 ...

  2. HDU 3586 二分答案+树形DP判定

    HDU 3586 『Link』HDU 3586 『Type』二分答案+树形DP判定 ✡Problem: 给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值cost表示破坏 ...

  3. BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP

    BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的 ...

  4. BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP

    题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...

  5. BZOJ4985 评分(二分答案+树形dp)

    首先二分答案简化一下问题,现在只有0和1了,要求最后剩下的是1.再简化一下考虑没有已固定的位置怎么做.考虑每个位置由其合并到的位置连边,显然这样形成了一棵三叉树.设f[i]为使得某位置为1其子树至少要 ...

  6. hdu3586 Information Disturbing[二分答案+树形DP]

    给定 n 个节点的树,边有权值.1 号点是根,除了 1 号点外的度数为 1 的节点是叶子.要求切断所有叶子和 1 号点之间的联系,切断一条边要花费这条边上权值对应的代价,要求总的代价不超过 m.在满足 ...

  7. 3月28日考试 题解(二分答案+树形DP+数学(高精))

    前言:考试挂了很多分,难受…… --------------------- T1:防御 题意简述:给一条长度为$n$的序列,第$i$个数的值为$a[i]$.现让你将序列分成$m$段,且让和最小的一段尽 ...

  8. luogu 2491 [SDOI2011]消防 / 1099 树网的核 单调队列 + 树上问题

    Code: #include<bits/stdc++.h> #define ll long long #define maxn 300001 #define inf 1000000000 ...

  9. NOIP2007 树网的核 && [BZOJ2282][Sdoi2011]消防

    NOIP2007 树网的核 树的直径的最长性是一个很有用的概念,可能对一些题都帮助. 树的直径给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和.树中最远的两个节点之间 ...

随机推荐

  1. Android学习之基础知识九 — 数据存储(持久化技术)之使用LitePal操作数据库

    上一节学习了使用SQLiteDatabase来操作SQLite数据库的方法,接下来我们开始接触第一个开源库:LitePal.LitePal是一款开源的Android数据库框架,它采用了对象关系映射(O ...

  2. android ImageLoader加载本地图片的工具类

    import android.widget.ImageView; import com.nostra13.universalimageloader.core.ImageLoader; /** * 异步 ...

  3. 从harbor部署到在k8s中使用

    一.概述 harbor是什么呢?英文单词的意思是:港湾.港湾用来存放集装箱(货物的),而docker的由来正是借鉴了集装箱的原理,所以harbor是用于存放docker的镜像,作为镜像仓库使用.官方的 ...

  4. koa2入门(3)mongoose 增删改查

    项目地址:https://github.com/caochangkui/demo/tree/koa-mongoose 连接数据库 数据库名字为:koa-mongoose const mongoose ...

  5. Quartz.Net分布式任务管理平台

           无关主题:一段时间没有更新文章了,与自己心里的坚持还是背驰,虽然这期间在公司做了统计分析,由于资源分配问题,自己或多或少的原因,确实拖得有点久了,自己这段时间也有点松懈,借口就不说那么多 ...

  6. 插件GsonFormat快速生成JSon实体类

    IntelliJ IDEA 个人觉得是目前最好最强最智能的Java IDE,默认已经集成了几乎所有主流的开发工具和框架. 1.常用工具支持Java日常开发需要接触到很多常用的工具,为了便于使用,很多工 ...

  7. Linux下FastDFS分布式存储-总结及部署记录

    一.分布式文件系统介绍分布式文件系统:Distributed file system, DFS,又叫做网络文件系统:Network File System.一种允许文件通过网络在多台主机上分享的文件系 ...

  8. Week 7 迭代总结

    写在前面: 本次我为团队博客写了一篇总结,深刻总结了我们组发生的问题以及将来要做的事情.有兴趣请移步http://www.cnblogs.com/Buaa-software Week 7 Alpha轮 ...

  9. app推广及主要代码

    app推广:      一.基本情况       我们把推广和调研都放在了一起,主要是调研,主要通过调查问卷和直接访问的方式,让调查的人能够看到我们app的主要功能, 然后做出评价和对此改善的意见.调 ...

  10. APP推广(预期方案)

    首先,在推广过程中有一些定的弊端:我们这个O2O平台暂时只能适用于学校局域网. 因为我们的APP才刚刚“出炉”不久,在网络上还是属于一篇空白的状态,我们想过可以在百度百科上进行相应的推广,如果有用户搜 ...