#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 40005
#define M 80005
#define LL long long
using namespace std;
const int INF = 0x3f3f3f3f;
int ver[M],edge[M],head[N],Next[M];
int n,m,tot,root;LL k;
void add(int x,int y,int w){
ver[++tot]=y;edge[tot]=w;Next[tot]=head[x];head[x]=tot;
ver[++tot]=x;edge[tot]=w;Next[tot]=head[y];head[y]=tot;
}
int sz[N],vis[N],mx,size;
LL d[N],q[N],l,r,ans=0;
//求出树的重心 因为找到重心后,递归子树不超过原来的一半,递归层数小于logn层
void getroot(int u,int fa){
sz[u]=1;int num=0;
for (int i=head[u];i;i=Next[i]){
int v=ver[i];
if (v==fa||vis[v])continue;
///继续深搜
getroot(v,u);
///计算出子树的大小
sz[u]+=sz[v];
///维护子树的最长的链
num=max(num,sz[v]);
}
///num代表的是子节点的最长链 size-sz[u]代表的是父亲链长
num=max(num,size-sz[u]);
if (num<mx)mx=num,root=u;
}
///计算某个节点所有子树中的节点的到这个节点的距离
void getdis(int u,int fa){
q[++r]=d[u];
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(v==fa||vis[v])continue;
d[v]=d[u]+edge[i];
getdis(v,u);
}
}
LL cal(int u,int val){
r=0;
d[u]=val;
getdis(u,0);
LL sum=0,l=1;
///把子树点到当前点的距离进行排序
sort(q+1,q+1+r);
cout<<u<<" "<<r<<endl;
for(int i=1;i<=r;i++){
cout<<q[i]<<" ";
}
cout<<endl;
///开一个左右指针,以左端点为基准移动,如果两个距离是大于k,肯定移动右指针,
///也就是对于每一个小的,去右边寻找最远能满足条件的,而中间的一定满足
while(l<r){
if(q[l]+q[r]<=k)sum+=r-l,++l;
else --r;
}
return sum;
}
void dfs(int u){
///计算当前节点内部所有>=k的数目 但是会存在连个点是在同一联通块内部 答案就不对了
ans+=cal(u,0);
vis[u]=1;
for (int i=head[u];i;i=Next[i]){
int v=ver[i];
if (vis[v])continue;
///这里我们减去内部在同一个联通块里面的答案 相当于剪掉重复的
ans-=cal(v,edge[i]);
///在当前点内部继续找重心
size=sz[v];
mx=INF;
getroot(v,0);
///然后找到子树的重心,进行深搜
dfs(root);
}
}
int main(){
int u,v,e,k;
while(~scanf("%d%d",&n,&k) && n+k) {
ans=0;
memset(vis,0,sizeof(vis));
memset(head,0,sizeof(head));
memset(Next,0, sizeof(Next));
for (int i = 1; i <n ; i++) {
scanf("%d%d%d", &u, &v, &e);
add(u, v, e);
}
size = n;
mx = INF;
getroot(1, 0);
dfs(root);
printf("%lld\n", ans);
}
return 0;
}

  

poj1741 树上距离小于等于k的对数 点分治 入门题的更多相关文章

  1. POJ1741--Tree (树的点分治) 求树上距离小于等于k的点对数

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12276   Accepted: 3886 Description ...

  2. P3806 离线多次询问 树上距离为K的点对是否存在 点分治

    询问树上距离为k的点对是否存在 直接n^2暴力处理点对 桶排记录 可以过 #include<cstdio> #include<cstring> #include<algo ...

  3. Codeforces 161.D. Distance in Tree-树分治(点分治,不容斥版)-树上距离为K的点对数量-蜜汁TLE (VK Cup 2012 Round 1)

    D. Distance in Tree time limit per test 3 seconds memory limit per test 512 megabytes input standard ...

  4. 洛谷 P3806 【模板】点分治1-树分治(点分治,容斥版) 模板题-树上距离为k的点对是否存在

    P3806 [模板]点分治1 题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入格式 n,m 接下来n-1条边a,b,c描述a到b有一条长度 ...

  5. [HNOI2003]消防局的设立(树上距离为k的最小覆盖问题)

    题目的大概意思现在有一棵树,在树上找半径小于等于2的最小覆盖点的最小个数. 题目链接 讲一讲此类题的贪心策略: 就是每次寻找最低没有被覆盖的点,显然对于覆盖它的所有点中,在他的祖先处设立一个点最优.所 ...

  6. poj 1987 节点距离小于等于K(树DP)

    这题和poj 1741是一模一样的 但是1741能AC的代码,在这里却是TLE,暂时没看出哪里出现了问题.. AC代码: #include <iostream> #include < ...

  7. 树点分治入门题poj1741

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 24253   Accepted: 8060 Description ...

  8. poj1741 树上的分治

    题意是说给了n个点的树n<=10000,问有多少个点对例如(a,b)他们的之间的距离小于等于k 采用树的分治做 #include <iostream> #include <cs ...

  9. 【点分治】【路径小于等于k的条数】【路径恰好等于k是否存在】

    POJ1741:Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 29574   Accepted: 9915 Des ...

随机推荐

  1. 你需要一个新的model实体的时候必须new一个.奇怪的问题: 使用poi解析Excel的把数据插入数据库同时把数据放在一个list中,返回到页面展示,结果页面把最后一条数据显示了N次

    数据库显示数据正常被插 插入一条打印一次数据,也是正常的,但是执行完,list就全部变成了最后一条数据.很奇怪 单步调试 给list插入第一条数据 model是6607 连续插了多条数据都是6607 ...

  2. JAVA数据库连接池的革命 -- 从BoneCP到HikariCP(转)

    从BoneCP到HikariCP 今天笔者本想更新一下项目中使用到的BoneCP版本的.却无意发现jolbox网站打不开了.起初以为是被墙掉了,经过一番查找,居然在BoneCP的Github站看到了如 ...

  3. Django--创建

    软件开发架构: c/s架构 客户端 服务端 b/s架构 浏览器 服务端 本质:b/s架构也是c/s架构 HTTP协议 超文本传输协议:规定了客户端与服务端之间消息传输的格式 四个特性: 1.基于TCP ...

  4. python基础--计算机网络

    网络编程: 软件开发架构: c/s架构(client/server) c:客户端 s:服务端 b/s架构(browser/server) b:浏览器 s:服务端 服务端:24小时不间断提供服务 客户端 ...

  5. MySQL忘记root密码重置密码(5.7版本)

    网上找了一堆方法都不行,经过折腾一番,发现MySQL不同版本重置密码也存在一定的差异!记录下Mysql5.7.18版本的重置密码方法. 1.找到/etc/mysql/my.cnf 修改此文件添加一行s ...

  6. day37 02-Hibernate二级缓存:二级缓存的散装数据

    一级缓存存放的是对象的地址.把对象的地址缓存下来了.二级缓存里面存放的是对象的散装数据.你再去获取的时候,因为一级缓存的生命周期结束了,它会从二级缓存中获取.从二级缓存中获取,因为它又会得到一个对象. ...

  7. 洛谷P1314 [NOIP2011提高组Day2T2] 聪明的质监员

    P1314 聪明的质监员 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: ...

  8. LINUX下C++编程如何获得某进程的ID

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> using namespace std; pi ...

  9. selenium(5):常用的8种元素定位

    selenium的webdriver提供了18种(注意不是8种)的元素定位方法,比较常用的定位方法是如下8种,xpath和css定位更加灵活,需要重点掌握其中一个. 经常会用到的8种定位:1.id定位 ...

  10. arcgis几何对象

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...