题目大意:

树上找到有多少条路径的边权值和>=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. TCP/IP 小知识

    子网掩码有数百种,这里只介绍最常用的两种子网掩码,它们分别是“255.255.255.0”和“255.255.0.0”. 1.子网掩码是“255.255.255.0”的网络:最后面一个数字可以在0~2 ...

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

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

  3. nginx安装笔记

    双节点安装 1 节点一 1.1 目录 /usr/local cd /usr/local 1.2 openssl rpm -ql openssl /usr/share/doc/openssl-1.0.0 ...

  4. SQL语句在数据库中是如何执行的

    第一步:应用程序把查询SQL语句发给服务器端执行 我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给服务器处理. 第二步:服务器解析请求的SQL语句 SQL计划缓存, ...

  5. phalcon: router规则与解析,已经生成router的链接地址

    本人采用的是假分模块(目录),通过命名空间来进行模块分组的,非官方分组,所以在router是都会加上 namespace 信息,你也可适当的参考: 前提: /** * 注册命名空间 */ $loade ...

  6. for( unsigned int i=heapSize/2-1; i>=0; --i)

    unsigned int的表示 今天在写堆排序的时候遇到一个BUG void builMaxHeap( int *arr,unsigned int heapSize){ unsigned int i; ...

  7. 为什么MB51本位币金额和采购订单历史本位币金额不一样?

    翻译 为什么物料凭证的本位币金额有时和采购订单历史记录物料的本位币金额不一致? 回答: 有2个字段对应FI存放位置.物料凭证的字段(MSEG-DMBER)是存放库存账目金额.采购订单历史(EKBE-D ...

  8. 界面显示这个时间格式的js代码: 2016年1月19日 星期二 乙未(羊)年 腊月初十

    today=new Date();function initArray(){ this.length=initArray.arguments.length for(var i=0;i<this. ...

  9. node.js应用Redis数据库

    node.js下使用Redis,首先: 1.有一台安装了Redis的服务器,当然,安装在本机也行 2.本机,也就是客户端,要装node.js 3.项目要安装nodejs_redis模块 注意第 3 点 ...

  10. ASP.NET MVC 5改进了基于过滤器的身份验证

    ASP.NET MVC 5包含在最近发布的Visual Studio 2013开发者预览版中,它使开发人员可以应用身份验证过滤器,它们提供了使用各种第三方供应商或自定义的身份验证提供程序进行用户身份验 ...