题解:

首先我们要知道一个性质:如果有多条直径 这个核不论在哪条直径上 答案都是一样的

这样我们就可以随便找一条直径 在这条直径上枚举核的位置

并且dfs预处理maxlon[i] (i在直径上) 表示到i的路径不经过直径的 离i最远的点到i的距离

这时核的偏心距就是max(maxlon[i],核的端点到直径的端点的长度) (i为核上的点)

这样就能O(n)求解

代码:

  1. #include <cstdio>
  2. const int N=,M=;
  3. struct inli{
  4. int next,data,lon;
  5. inli(const int a=,const int b=,const int c=):
  6. next(a),data(b),lon(c){}
  7. }line[N*];
  8. int S,n,m,son[N],fat[N],dis[N],bo[N],maxlon[N],seclon[N],hard[N],nl;
  9. int max(int x,int y){ return x>y ? x : y;}
  10. int min(int x,int y){ return x<y ? x : y;}
  11. void makedis(int t){
  12. bo[t]=;
  13. for (int i=son[t];i;i=line[i].next)
  14. if (!bo[line[i].data]){
  15. int ne=line[i].data;
  16. dis[ne]=dis[t]+line[i].lon;
  17. makedis(ne);
  18. }
  19. }
  20. void makefat(int t){
  21. for (int i=son[t];i;i=line[i].next)
  22. if (line[i].data!=fat[t]){
  23. int ne=line[i].data;
  24. fat[ne]=t;
  25. makefat(ne);
  26. if (maxlon[ne]+line[i].lon>maxlon[t]){
  27. seclon[t]=maxlon[t];
  28. maxlon[t]=maxlon[ne]+line[i].lon;
  29. hard[t]=i;
  30. }
  31. }
  32. }
  33. int makef(int x,int y){
  34. if (!x) return ;
  35. int i=hard[x];
  36. if (y<line[i].lon) return maxlon[x];
  37. return max(seclon[x],makef(line[i].data,y-line[i].lon));
  38. }
  39. int getans(){
  40. int res=;
  41. for (int i=S,x=seclon[S];i;x+=line[hard[i]].lon,i=line[hard[i]].data){
  42. if (x>res) break;
  43. res=min(res,max(makef(i,m),x));
  44. }
  45. return res;
  46. }
  47. int main(){
  48. scanf("%d%d",&n,&m);
  49. for (int x,y,z,i=;i<n;i++){
  50. scanf("%d%d%d",&x,&y,&z);
  51. line[++nl]=inli(son[x],y,z),son[x]=nl;
  52. line[++nl]=inli(son[y],x,z),son[y]=nl;
  53. }
  54. makedis();
  55. int x=;
  56. for (int i=;i<=n;i++)
  57. if (dis[i]>x) x=dis[i],S=i;
  58. makefat(S);
  59. printf("%d",getans());
  60. }

【noip2007】树网的核的更多相关文章

  1. Cogs 97. [NOIP2007] 树网的核 Floyd

    题目: http://cojs.tk/cogs/problem/problem.php?pid=97 97. [NOIP2007] 树网的核 ★☆   输入文件:core.in   输出文件:core ...

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

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

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

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

  4. noip2007 树网的核

    P1099 树网的核 112通过 221提交 题目提供者该用户不存在 标签动态规划树形结构2007NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录   题目描述 设T=(V, E, W) ...

  5. 洛谷1099 [NOIP2007] 树网的核

    链接https://www.luogu.org/problemnew/show/P1099 题目描述 设T=(V,E,W)是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称TTT为 ...

  6. NOIP2007 树网的核 [提高组]

    题目:树网的核 网址:https://www.luogu.com.cn/problem/P1099 题目描述 设 T=(V,E,W)T=(V,E,W) 是一个无圈且连通的无向图(也称为无根树),每条边 ...

  7. noip2007树网的核

    想一下可以发现随便枚举一条直径做就可以了. 核越长越好.于是枚举核的过程可以做到O(n) 然后就是统计答案. 对于每个核最大偏心距肯定是核上面每个点不走核内的点所能走到的最远点的最值. 而且对于核的两 ...

  8. BZOJ2282 SDOI2011消防/NOIP2007树网的核(二分答案+树形dp)

    要求最大值最小容易想到二分答案.首先对每个点求出子树中与其最远的距离是多少,二分答案后就可以标记上一些必须在所选择路径中的点,并且这些点是不应存在祖先关系的.那么如果剩下的点数量>=3,显然该答 ...

  9. [BZOJ1999][codevs1167][Noip2007]Core树网的核

    [BZOJ1999][codevs1167][Noip2007]Core树网的核 试题描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(t ...

  10. BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP

    BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T ...

随机推荐

  1. hdu 4403

    水水的dfs #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath& ...

  2. 关于.net中的脚本语言使用

    基于.net中drl框架的脚本现在有很多,最近也由于工作的需要,目前有lua.python.ruby.javascript的.net实现,对ruby不怎么了解,python.lua.js就成了试验的对 ...

  3. 初试docker以及搭建mysql on docker

    前一阵阅读了google的borg论文,在最后的related works和总结中发现了kubernetes.从论文中了解的kubernetes这个东西很有意思,按照论文所说,它的实现有希望解决an ...

  4. 深入浅出ShellExecute

    Q: 如何打开一个应用程序? ShellExecute(this->m_hWnd,"open","calc.exe",""," ...

  5. [itint5]Excel数转换

    http://www.itint5.com/oj/#23 这里就是26进制的转换,但是要注意没有0,A就是1,Z就是26.所以要想象成从0开始,才能用原来的方法计算. //将十进制数转换为excel数 ...

  6. JSON格式转换成XML格式

    第一种方法: 需要使用命名空间System.Runtime.Serialization.Json 下面有JsonReaderWriterFactory XmlDictionaryReader read ...

  7. Ubuntu12.04安装JDK6

    因为我们要搭建Android2.3的开发环境,只需要安装JDK6就可以,下面是其下载地址: http://www.oracle.com/technetwork/java/javase/download ...

  8. 完全用xml实现imageview点击换一张图片

    <ImageView android:layout_width="60dp" android:layout_height="60dp" android:b ...

  9. iOS application: how to clear notifications?

    http://stackoverflow.com/questions/8682051/ios-application-how-to-clear-notifications up vote105down ...

  10. hdu 2955 Robberies

    Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...