题目大意:

树上找到有多少条路径的边权值和>=k

这里在树上进行点分治,需要找到重心保证自己的不会出现过于长的链来降低复杂度

 #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 树的点分治(入门)

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

  2. POJ 1741 树分治

    题目链接[http://poj.org/problem?id=1741] 题意: 给出一颗树,然后寻找点对(u,v)&&dis[u][v] < k的对数. 题解: 这是一个很经典 ...

  3. poj 1741 树的分治

    思路:这题我是看 漆子超<分治算法在树的路径问题中的应用>写的. 附代码: #include<iostream> #include<cstring> #includ ...

  4. POJ 1741 Tree 树上点分治

    题目链接:http://poj.org/problem?id=1741 题意: 给定一棵包含$n$个点的带边权树,求距离小于等于K的点对数量 题解: 显然,枚举所有点的子树可以获得答案,但是朴素发$O ...

  5. POJ 1741 Tree (点分治)

                                                                        Tree Time Limit: 1000MS   Memory ...

  6. poj 1741 Tree(点分治)

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

  7. POJ 1741 树上 点的 分治

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

  8. POJ 1741 树上的点分治

    题目大意: 找到树上点对间距离不大于K的点对数 这是一道简单的练习点分治的题,注意的是为了防止点分治时出现最后分治出来一颗子树为一条直线,所以用递归的方法求出最合适的root点 #include &l ...

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

    poj 1741 Tree(树的点分治) 给出一个n个结点的树和一个整数k,问有多少个距离不超过k的点对. 首先对于一个树中的点对,要么经过根结点,要么不经过.所以我们可以把经过根节点的符合点对统计出 ...

随机推荐

  1. Android热修复

    https://github.com/WeMobileDev/article/blob/master/%E5%BE%AE%E4%BF%A1Android%E7%83%AD%E8%A1%A5%E4%B8 ...

  2. 本地存储 localStorage/sessionStorage/cookie

    cookie是个基础的东西.是服务器发送到客户端,存储在客户端的一小段数据.可以存储一些配置信息,客户标识信息等.用户下次访问这个网站时,会把上次网站发来的cookie一同发送回去.cookie保存在 ...

  3. hadoop 入门实例【转】

    原文链接:http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html 1.数据去重  "数据去重"主要是为了掌握 ...

  4. 批处理+VBS+注册表实现开机自动启动EXE程序

    批处理+VBS+注册表实现WINDOWS开机自动启动EXE程序 以下都是基于WINDOWS系统. 我们都知道当我们有想某个程序在开机时自动运行,只能有三个方式: 1.做成服务,然后对服务进行配置为自动 ...

  5. python类、对象、方法、属性之类与对象笔记

    python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...

  6. hibernate模块

    hibernate-core : 核心模块,定义了 ORM 特性和API,还有各种集成的SPIs. hibernate-entitymanager : 定义 对 JPA(Java Persistenc ...

  7. Java 默认/缺省 server 还是 client 模式

    不多说,复制官方文档,适用于 Java 5 6 7 Architecture OS Default client VM if server-class, server VM; otherwise, c ...

  8. JavaScript设计模式与开发实践 - 观察者模式

    概述 观察者模式又叫发布 - 订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个目标对象(为了方便理解,以下将观察者对象叫做订阅者,将目标对象叫做 ...

  9. 编程获得CPU的主频

    CPU的主频,即CPU内核工作的时钟频率(CPU Clock Speed).CPU的主频表示在CPU内数字脉冲信号震荡的速度.主频和实际的运算速度存在一定的关系,但目前还没有一个确定的公式能够定量两者 ...

  10. jmeter 建立一个JMS主题测试计划

    创建两个线程组和组 每一个到10迭代. 总消息线程(6)x(1消息) (重复10次)= 60消息. 建立测试计划,您将使用 以下元素: 线程组 , JMS的出版商 , JMS用户 , 图结果 . 一般 ...