题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2599

题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小.

题意:每次找到当前树的重心作为树根,查找通过当前树根的路径。

  1. #include<algorithm>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<ctime>
  7. int tot,go[],next[],first[],val[];
  8. int size[],F[],cnt[],a[],root,n,K,vis[];
  9. int dis[],ans,sz,h[],sum;
  10. long long sx;
  11. int read(){
  12. char ch=getchar();int t=,f=;
  13. while (ch<''||ch>'') {
  14. if (ch=='-') f=-;
  15. ch=getchar();
  16. }
  17. while (''<=ch&&ch<=''){
  18. t=t*+ch-'';
  19. ch=getchar();
  20. }
  21. return t*f;
  22. }
  23. void insert(int x,int y,int z){
  24. tot++;
  25. go[tot]=y;
  26. next[tot]=first[x];
  27. first[x]=tot;
  28. val[tot]=z;
  29. }
  30. void add(int x,int y,int z){
  31. insert(x,y,z);
  32. insert(y,x,z);
  33. }
  34. void findroot(int x,int fa){
  35. size[x]=;F[x]=;
  36. for (int i=first[x];i;i=next[i]){
  37. int pur=go[i];
  38. if (pur==fa||vis[pur]) continue;
  39. findroot(pur,x);
  40. size[x]+=size[pur];
  41. F[x]=std::max(F[x],size[pur]);
  42. }
  43. F[x]=std::max(F[x],sum-size[x]);
  44. if (F[root]>F[x]) root=x;
  45. }
  46. void dfs1(int x,int fa){
  47. sx++;
  48. if (dis[x]>K) return;
  49. if (h[K-dis[x]]==sz) ans=std::min(ans,a[K-dis[x]]+cnt[x]);
  50. for (int i=first[x];i;i=next[i]){
  51. int pur=go[i];
  52. if (pur==fa||vis[pur]) continue;
  53. cnt[pur]=cnt[x]+;
  54. dis[pur]=dis[x]+val[i];
  55. dfs1(pur,x);
  56. }
  57. }
  58. void dfs2(int x,int fa){
  59. if (dis[x]>K) return;
  60. if (h[dis[x]]!=sz) h[dis[x]]=sz,a[dis[x]]=cnt[x];
  61. else a[dis[x]]=std::min(a[dis[x]],cnt[x]);
  62. for (int i=first[x];i;i=next[i]){
  63. int pur=go[i];
  64. if (pur==fa||vis[pur]) continue;
  65. dfs2(pur,x);
  66. }
  67. }
  68. int find(int x,int fa){
  69. int all=;
  70. for (int i=first[x];i;i=next[i]){
  71. int pur=go[i];
  72. if (pur==fa||vis[pur]) continue;
  73. all+=find(pur,x);
  74. }
  75. return all;
  76. }
  77. void query(int x){
  78. h[]=++sz;
  79. a[]=;
  80. vis[x]=;
  81. for (int i=first[x];i;i=next[i]){
  82. int pur=go[i];
  83. if (vis[pur]) continue;
  84. dis[pur]=val[i];
  85. cnt[pur]=;
  86. dfs1(pur,x);
  87. dfs2(pur,x);
  88. }
  89. for (int i=first[x];i;i=next[i]){
  90. int pur=go[i];
  91. if (vis[pur]) continue;
  92. root=;
  93. sum=find(pur,);
  94. findroot(pur,);
  95. query(root);
  96. }
  97. }
  98. int main(){
  99. n=read();K=read();
  100. for (int i=;i<n;i++){
  101. int x,y,z;
  102. x=read();
  103. y=read();
  104. z=read();
  105. x++;y++;
  106. add(x,y,z);
  107. }
  108. root=;
  109. F[]=n+;
  110. ans=n;
  111. sum=n;
  112. findroot(,);
  113. query(root);
  114. if (ans==n) ans=-;
  115. printf("%d\n",ans);
  116. }

BZOJ 2599 Race(树分治)的更多相关文章

  1. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  2. BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)

    BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...

  3. [BZOJ 4025]二分图(线段树分治+带边权并查集)

    [BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...

  4. BZOJ 2152: 聪聪可可 树分治

    2152: 聪聪可可 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...

  5. BZOJ 2566 xmastree(树分治+multiset)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2566 题意:一棵有边权的树.结点有颜色.每次修改一个点的颜色.求每次修改后所有同色 ...

  6. bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...

  7. bzoj 4025 二分图——线段树分治+LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...

  8. UVA 12161 Ironman Race in Treeland (树分治)

    题意:求树上的一条费用不超过m的路径,使得总长度尽量大. 人参第一发树分治,紫书上思路讲得比较清晰,这里不再赘述. 实现的时候,用一个类似时间戟的东西,记录结点首次访问的时间,并保存结点序列. 合并的 ...

  9. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)

    传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...

随机推荐

  1. windows下的用户态调试的底层与上层实现

    操作系统:windows XP 调试器通过CreateProcess传入带有DEBUG_PROCESS和DEBUG_ONLY_THIS_PROCESS的dwCreationFlags创建被调试进程.这 ...

  2. Hadoop开发遇到的问题之reduce卡住

    遇到的问题描述:在hadoop上面执行程序,程序运行之后能够正常执行.一切似乎都是正常的,然而过了一段时间之后程序便开始阻塞直到程序超时退出(如下). 14/08/19 21:17:51 INFO m ...

  3. c语言指针与结构体之内存动态分配

    struct dangdangtest { ]; ]; ]; int num; int bugnum; ]; ]; double RMB; }; void main2() { //struct dan ...

  4. qt下面例子学习(部分功能)

    from aa import Ui_Formfrom PyQt4.Qt import *from PyQt4.QtCore import *from PyQt4.QtGui import *from ...

  5. WebService-调用第三方提供的webService服务

    互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据和查询国内手机号码归属地为 ...

  6. (转)iOS7界面设计规范(5) - UI基础 - 导航

    通过分页控件(page control)来暗示多个条目或内容视图的存在.该控件可以有效的向用户展示内容单元的数量,以及当前所见的这一条在队列中的位置.请参考分页控件一节,了解更多详情. 注意:虽然工具 ...

  7. WP系统推广难的原因之中的一个之我见

    个人也觉得如今的Android市场几家独大,竞争太激烈.利润空间挤压太严重,有实力的厂家不如尝试剑走偏锋,在其它大佬都还没跟进的时候,把市场投向WP.先入为主,不失为良策! 话说Microsoft不开 ...

  8. Button和ImageButton

    Button----button ImageButton----图片button 共同拥有特征: 都能够作为一个button产生点击事件 不同点 1. Button有text的属性.ImageButt ...

  9. 压位加速-poj-2443-Set Operation

    题目链接: http://poj.org/problem?id=2443 题目意思: 有n个集合(n<=1000),每个集合有m个数ai(m<=10000,1=<ai<=100 ...

  10. Android自定义控件(二)——有弹性的ScrollView

    本文在http://gundumw100.iteye.com/blog/1075286的基础上稍作修改, 实现了当手指滑动到ScrollView的顶部.底部时, 可以继续的向上.向下拉伸.当释放手指的 ...