题目大意:

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

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

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm> using namespace std;
#define N 10005
int n , m , k , first[N]; struct Edge{
int y , next , d;
Edge(){}
Edge(int y , int next , int d):y(y),next(next),d(d){}
}e[N<<]; void add_edge(int x , int y , int d)
{
e[k] = Edge(y , first[x] , d);
first[x] = k++;
} int sz[N] , dis[N] , f[N] , d[N] , cnt , root , ret;
bool use[N]; void find_root(int u , int fa , int size)
{
sz[u] = , f[u] = ;
int v;
for(int i=first[u] ; ~i ; i=e[i].next){
if(use[v=e[i].y] || v==fa) continue;
find_root(v , u , size);
sz[u] += sz[v] ;
f[u] = max(f[u] , sz[v]);
}
f[u] = max(f[u] , size-sz[u]);
if(f[u]<f[root]) root = u;
} void dfs(int u , int fa)
{
d[cnt++] = dis[u];
sz[u] = ;
int v;
for(int i=first[u] ; ~i ; i=e[i].next){
if(use[v=e[i].y] || v==fa) continue;
dis[v] = dis[u]+e[i].d;
if(dis[v]>m) continue;
dfs(v , u);
sz[u] += sz[v];
}
} int cal(int u , int val)
{
dis[u] = val , cnt=;
dfs(u , );
sort(d , d+cnt);
int ret = ;
for(int l= , r=cnt- ; l<r ; )
if(d[l]+d[r]<=m) ret+=r-l++;
else r--;
return ret;
} void solve(int u)
{
ret+=cal(u , );
use[u] =true;
int v;
for(int i=first[u] ; ~i ; i=e[i].next){
if(use[v=e[i].y]) continue;
ret -= cal(v , e[i].d);
find_root(v , root= , sz[v]);
solve(root);
}
} int main()
{
// freopen("in.txt" , "r" , stdin);
int x,y,d;
while(scanf("%d%d" , &n , &m) , n+m)
{
memset(first , - , sizeof(first));
k = ;
for(int i= ; i<n ; i++){
scanf("%d%d%d" , &x , &y , &d);
add_edge(x , y , d);
add_edge(y , x , d);
}
memset(use , , sizeof(use));
ret= , f[] = 1e9;
find_root( , root= , n);
solve(root);
printf("%d\n" , ret);
}
}

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. Android提高篇之自定义dialog实现processDialog“正在加载”效果、使用Animation实现图片旋转

     知识点: 1.使用imageview.textview自定义dialog 2.使用Animation实现图片旋转动画效果 3.通过自定义theme去掉dialog的title 没有使用progres ...

  2. 加速Eclipse使其成为超快的IDE

    按照下述步骤来加速Eclipse为超快的IDE,它适用于32和64位版本的Eclipse /JDK(OS为64位Windows 7). 1.禁用防病毒软件,或将JDK.Eclipse.workspac ...

  3. linux mount命令的用法详细解析

    挂接命令(mount)首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的.命令格式:mount [-t vfstype] [-o options] ...

  4. python语法笔记(五)

    1.python内存管理 (1)对象内存使用 &nsbp;&nsbp;&nsbp;&nsbp;在python中通过执行内建函数 id(obj) 可以获得对象obj在内存 ...

  5. Linux命令行下编译Android NDK的示例代码

    这几天琢磨写一个Android的Runtime用来加速HTML5 Canvas,让GameBuilder+CanTK 不但开发速度快,运行速度也能接近原生应用.所以花了点时间研究 Android ND ...

  6. as与c++的反射机制对比

    所谓反射机制(Reflection),简单来说,就是可以根据class的名称获取这个class以及其对应的实例.具体来说, 指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句 ...

  7. package-info.java文件详解

    欢迎关注我的社交账号: 博客园地址: http://www.cnblogs.com/jiangxinnju/p/4781259.html GitHub地址: https://github.com/ji ...

  8. 【CITE】VS2012程序打包部署

      选择Debug模式将项目重新生成,并保证没有任何bug   选择解决方案,右击——添加——新建项目——安装和部署   下载过打包工具InstallShield2013LimitedEdition, ...

  9. css3属性 transition transform

    1.transition 译:过渡,转变 可以设置过渡属性 transition: property duration timing-function delay; transition-proper ...

  10. [redis] 分布式 Redis 的 CRUD 实现

    1.applicationContext-redis.xml <?xml version="1.0" encoding="UTF-8"?> < ...