Description

Give a tree with n vertices,each edge has a length(positive integer less than 1001).
Define dist(u,v)=The min distance between node u and v.

Give an integer k,for every pair (u,v) of vertices is called valid if and only if dist(u,v) not exceed k.

Write a program that will count how many pairs which are valid for a given tree.

Input

The
input contains several test cases. The first line of each test case
contains two integers n, k. (n<=10000) The following n-1 lines each
contains three integers u,v,l, which means there is an edge between node
u and v of length l.

The last test case is followed by two zeros.

Output

For each test case output the answer on a single line.

Sample Input


Sample Output


Source

Solution

1.点分治+排序

先找出重心,求解答案。对于每个重心,计算出所有过该点的最短路径长度小于或等于k的点对,记此答案为ans1

由于这些点对中会出现如下情况:

即,设任意分治出的子树重心的儿子为p,可能出现两个p的儿子共用了p到重心的路径,不符合最短路径要求

为了减去这种情况,我们可以递归算出所有关于p的重复答案,计为ans2

ans1-sum(ans2)即为最后答案

16456848

  ksq2013 1741 Accepted 760K 172MS C++ 1547B 2017-01-07 13:50:58
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 10010
#define inf ~0U>>1
using namespace std;
int fst[N],ecnt,ans;
struct edge{
int v,w,nxt;
}e[N<<];
inline void link(int x,int y,int w){
e[++ecnt].v=y;
e[ecnt].w=w;
e[ecnt].nxt=fst[x];
fst[x]=ecnt;
}
bool vis[N];
int n,m,root,f[N],size[N],d[N],deep[N],sum,top;
void getroot(int x,int fa){
f[x]=;
size[x]=;
for(int j=fst[x];j;j=e[j].nxt)
if(e[j].v^fa&&!vis[e[j].v])
getroot(e[j].v,x),
size[x]+=size[e[j].v],
f[x]=max(f[x],size[e[j].v]);
f[x]=max(f[x],sum-size[x]);
if(f[x]<=f[root])root=x;
}
void getdeep(int x,int fa){
deep[++top]=d[x];
for(int j=fst[x];j;j=e[j].nxt)
if(e[j].v^fa&&!vis[e[j].v])
d[e[j].v]=d[x]+e[j].w,
getdeep(e[j].v,x);
}
int cal(int x,int v){
d[x]=v;top=;
getdeep(x,);
sort(deep+,deep++top);
int t=;
for(int l=,r=top;l<r;)
if(deep[l]+deep[r]<=m)
t+=r-l,l++;
else r--;
return t;
}
void solve(int x){
vis[x]=;
ans+=cal(x,);
for(int j=fst[x];j;j=e[j].nxt)
if(!vis[e[j].v])
ans-=cal(e[j].v,e[j].w),
root=,sum=size[e[j].v],
getroot(e[j].v,root),
solve(root);
}
int main(){
while(scanf("%d%d",&n,&m)&&n){
ans=ecnt=;memset(fst,,sizeof(fst));
memset(vis,,sizeof(vis));
for(int i=;i<n;i++){
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
link(x,y,w);link(y,x,w);
}
root=;f[]=inf;sum=n;
getroot(,);
solve(root);
printf("%d\n",ans);
}
return ;
}

[poj1741][tree] (树/点分治)的更多相关文章

  1. POJ1741——Tree(树的点分治)

    1 /* *********************************************** 2 Author :kuangbin 3 Created Time :2013-11-17 1 ...

  2. POJ 1741 Tree 树的分治

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

  3. POJ1741 Tree 树分治模板

    http://poj.org/problem?id=1741   题意:一棵n个点的树,每条边有距离v,求该树中距离小于等于k的点的对数.   dis[y]表示点y到根x的距离,v代表根到子树根的距离 ...

  4. poj 1741 Tree (树的分治)

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 30928   Accepted: 10351 Descriptio ...

  5. POJ1741 tree 【点分治】

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 25286   Accepted: 8421 Description ...

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

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

  7. [poj1741 Tree]树上点分治

    题意:给一个N个节点的带权树,求长度小于等于K的路径条数 思路:选取一个点作为根root,假设f(root)是当前树的答案,那么答案来源于两部分: (1)路径不经过root,那么就是完全在子树内,这部 ...

  8. E. Alternating Tree 树点分治|树形DP

    题意:给你一颗树,然后这颗树有n*n条路径,a->b和b->a算是一条,然后路径的权值是 vi*(-1)^(i+1)  注意是点有权值. 从上头往下考虑是点分治,从下向上考虑就是树形DP, ...

  9. POJ1741 tree (点分治模板)

    题目大意: 给一棵有 n 个顶点的树,每条边都有一个长度(小于 1001 的正整数).定义 dist(u,v)=节点 u 和 v 之间的最小距离.给定一个整数 k,对于每一对 (u,v) 顶点当且仅当 ...

随机推荐

  1. UploadFile控件,提交图片后,页面预览显示刚刚提交的图片

    最近在用asp.net来写一个新闻系统后台,然后由于不用用网上的flash插件来上传图片什么的,我就用asp.net的控件来写,但是控件总归有一些用的不够灵活的地方.这次测试提出,文章在修改的时候,需 ...

  2. Linux 14.04lts 环境下搭建交叉编译环境arm-linux-gcc-4.5.1

    交叉编译工具链是为了编译.链接.处理和调试跨平台体系结构的程序代码,在该环境下编译出嵌入式Linux系统所需要的操作系统.应用程序等,然后再上传到目标板上. 首 先要明确gcc 和arm-linux- ...

  3. geotrellis使用(二十六)实现海量空间数据的搜索处理查看

    目录 前言 前台实现 后台实现 总结 一.前言        看到这个题目有人肯定会说这有什么可写的,最简单的我只要用文件系统一个个查找.打开就可以实现,再高级一点我可以提取出所有数据的元数据,做个元 ...

  4. three.js笔记

    /*** 场景(scene) ***/ var scene = new THREE.Scene(); // 创建场景 scene.add(x); // 插入场景 /*** 相机(camera) *** ...

  5. ZKWeb网站框架介绍

    框架地址 https://github.com/zkweb-framework/ZKWeb https://github.com/zkweb-framework/ZKWeb.Plugins 新的文档地 ...

  6. css3新单位学习

    vw,vh,vmin,vmax vw 1vw = 视窗width*1% vh 1vh = 视窗heihgt*1% 如果视窗的宽度小于高度,1vmin = 1vw,如果视窗宽度大于高度,1vmin = ...

  7. iFrame 功能详解

    目录索引: 一. 简介二. 属性三. 功能四. 应用 一.简介 网页“帧”的概念最早是由Netscape所提出,当时全部由“帧”构成的页面,也被称之为 “框架集”页面,在一个“框架集”页面中,“帧” ...

  8. STemwin汉字显示

    硬件环境: STM32F429,电容屏800X480 5点触控RGB屏幕 ,SPI flash: 软件环境: UCOSIII,STemwin: 汉字显示方法: 1.在SPIflash中装在字库XBF_ ...

  9. 类型“System.Data.Linq.DataContext”在未被引用的程序集中定义。必须添加对程序集“System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”的引用。

    解决方法:添加System.Data.Linq.dll引用 http://www.cnblogs.com/m84641693/archive/2010/07/26/1785100.html http: ...

  10. StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...