题目大意:

找到树上点对间距离不大于K的点对数

这是一道简单的练习点分治的题,注意的是为了防止点分治时出现最后分治出来一颗子树为一条直线,所以用递归的方法求出最合适的root点

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <vector>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8. #define N 10005
  9. int n , m , k , first[N];
  10.  
  11. struct Edge{
  12. int y , next , d;
  13. Edge(){}
  14. Edge(int y , int next , int d):y(y),next(next),d(d){}
  15. }e[N<<];
  16.  
  17. void add_edge(int x , int y , int d)
  18. {
  19. e[k] = Edge(y , first[x] , d);
  20. first[x] = k++;
  21. }
  22.  
  23. int sz[N] , dis[N] , f[N] , d[N] , cnt , root , ret;
  24. bool use[N];
  25.  
  26. void find_root(int u , int fa , int size)
  27. {
  28. sz[u] = , f[u] = ;
  29. int v;
  30. for(int i=first[u] ; ~i ; i=e[i].next){
  31. if(use[v=e[i].y] || v==fa) continue;
  32. find_root(v , u , size);
  33. sz[u] += sz[v] ;
  34. f[u] = max(f[u] , sz[v]);
  35. }
  36. f[u] = max(f[u] , size-sz[u]);
  37. if(f[u]<f[root]) root = u;
  38. }
  39.  
  40. void dfs(int u , int fa)
  41. {
  42. d[cnt++] = dis[u];
  43. sz[u] = ;
  44. int v;
  45. for(int i=first[u] ; ~i ; i=e[i].next){
  46. if(use[v=e[i].y] || v==fa) continue;
  47. dis[v] = dis[u]+e[i].d;
  48. if(dis[v]>m) continue;
  49. dfs(v , u);
  50. sz[u] += sz[v];
  51. }
  52. }
  53.  
  54. int cal(int u , int val)
  55. {
  56. dis[u] = val , cnt=;
  57. dfs(u , );
  58. sort(d , d+cnt);
  59. int ret = ;
  60. for(int l= , r=cnt- ; l<r ; )
  61. if(d[l]+d[r]<=m) ret+=r-l++;
  62. else r--;
  63. return ret;
  64. }
  65.  
  66. void solve(int u)
  67. {
  68. ret+=cal(u , );
  69. use[u] =true;
  70. int v;
  71. for(int i=first[u] ; ~i ; i=e[i].next){
  72. if(use[v=e[i].y]) continue;
  73. ret -= cal(v , e[i].d);
  74. find_root(v , root= , sz[v]);
  75. solve(root);
  76. }
  77. }
  78.  
  79. int main()
  80. {
  81. // freopen("in.txt" , "r" , stdin);
  82. int x,y,d;
  83. while(scanf("%d%d" , &n , &m) , n+m)
  84. {
  85. memset(first , - , sizeof(first));
  86. k = ;
  87. for(int i= ; i<n ; i++){
  88. scanf("%d%d%d" , &x , &y , &d);
  89. add_edge(x , y , d);
  90. add_edge(y , x , d);
  91. }
  92. memset(use , , sizeof(use));
  93. ret= , f[] = 1e9;
  94. find_root( , root= , n);
  95. solve(root);
  96. printf("%d\n" , ret);
  97. }
  98. }

POJ 1741 树上的点分治的更多相关文章

  1. POJ 1741 树上 点的 分治

    题意就是求树上距离小于等于K的点对有多少个 n2的算法肯定不行,因为1W个点 这就需要分治.可以看09年漆子超的论文 本题用到的是关于点的分治. 一个重要的问题是,为了防止退化,所以每次都要找到树的重 ...

  2. poj 1741 树的点分治(入门)

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18205   Accepted: 5951 Description ...

  3. POJ 1741 树的点分治

    题目大意: 树上找到有多少条路径的边权值和>=k 这里在树上进行点分治,需要找到重心保证自己的不会出现过于长的链来降低复杂度 #include <cstdio> #include & ...

  4. POJ 1741 Tree 树的分治

    原题链接:http://poj.org/problem?id=1741 题意: 给你棵树,询问有多少点对,使得这条路径上的权值和小于K 题解: 就..大约就是树的分治 代码: #include< ...

  5. POJ 1741 Tree【树分治】

    第一次接触树分治,看了论文又照挑战上抄的代码,也就理解到这个层次了.. 以后做题中再慢慢体会学习. 题目链接: http://poj.org/problem?id=1741 题意: 给定树和树边的权重 ...

  6. poj 1741 Tree(点分治)

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15548   Accepted: 5054 Description ...

  7. POJ 1741 Tree (树分治入门)

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8554   Accepted: 2545 Description ...

  8. POJ 1741 Tree (点分治)

                                                                        Tree Time Limit: 1000MS   Memory ...

  9. POJ 1741 Tree 树的分治(点分治)

    题目大意:给出一颗无根树和每条边的权值,求出树上两个点之间距离<=k的点的对数. 思路:树的点分治.利用递归和求树的重心来解决这类问题.由于满足题意的点对一共仅仅有两种: 1.在以该节点的子树中 ...

随机推荐

  1. 2 CSS

    2 CSS CSS基础 html 在一个网页中负责的事情是一个页面的结构css(层叠样式表) 在一个网页中主要负责了页面的数据样式. 编写css代码的方式:     第一种: 在style标签中编写c ...

  2. 列车时刻表查询 jqm/ajax/xml

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  3. Hbase之尝试使用错误列族获取数据

    import com.google.common.base.Strings; import org.apache.hadoop.conf.Configuration; import org.apach ...

  4. 初识Ildasm.exe——IL反编译的实用工具

    原文地址:http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html Ildasm.exe 概要: 一.前言: 微软的IL反 ...

  5. IE7局部滚动区域下绝对定位或相对定位元素不随滚动条滚动的bug

    尽管在项目中测试人员已经慢慢淡化了IE6的测试,但是IE7依然还是要纳入测试范围. 最近碰到一个IE7的蛋疼bug,在页面上设置了一个局部的滚动区域,在拖动滚动条的时候,滚动区域内设置了相对定位或绝对 ...

  6. hdu 1026 Ignatius and the Princess I (bfs+记录路径)(priority_queue)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1026 Problem Description The Princess has been abducted ...

  7. JavaWeb学习-Tomcat

    打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:

  8. Python--关于 join 和 split

    .join() join将 容器对象 拆分并以指定的字符将列表内的元素(element)连接起来,返回字符串(注:容器对象内的元素须为字符类型) >>> a = ['no','pai ...

  9. iOS 中对 HTTPS 证书链的验证

    这篇文章是我一边学习证书验证一边记录的内容,稍微整理了下,共扯了三部分内容: HTTPS 简要原理: 数字证书的内容.生成及验证: iOS 上对证书链的验证. HTTPS 概要 HTTPS 是运行在 ...

  10. 用XmlSerializer进行xml反序列化的时候,程序报错: 不应有 <xml xmlns=''>

    原因 一,类型错误: 比如xml本来是UserInfo类型 用XmlSerializer进行反序列化传入的类型是MemberInfo这就会报错 二,xml根节点和对象的类名不一致,而又没有对类加入[X ...