方法:指针扫描数组

每次选择树的重心作为树根,从树根出发进行一次DFS,求出点到树根的距离,把节点按照与树根的的距离放进数组d,设置两个指针L,R分别从前、后开始扫描,每次满足条件时答案累加R-L。,之后减去子树的满足条件的情况,删除根节点,对其子树继续上述操作,不断累加答案。

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=100010;
vector<pair<int,int> >G[maxn];
int d[maxn],size[maxn],root,max_w,n1,cnt,n,k;
bool vis[maxn];
void get_root(int x,int f){//求树的重心
size[x]=1;
int max_part=0;
for(int i=0;i<G[x].size();i++){
int Next=G[x][i].first;
if(Next!=f&&!vis[Next]){
get_root(Next,x);
size[x]+=size[Next];
max_part=max(max_part,size[Next]);
}
}
max_part=max(max_part,n1-size[x]);
if(max_part<max_w){
root=x;
max_w=max_part;
}
}
void get_dist(int x,int f,int dist){//算距离
d[++cnt]=dist;
size[x]=1;//算距离的同时也更新一下子树的大小
for(int i=0;i<G[x].size();i++){
int Next=G[x][i].first;
if(Next!=f&&!vis[Next]){
get_dist(Next,x,dist+G[x][i].second);
size[x]+=size[Next];
}
}
}
int cal(int x,int y){//计算
cnt=0;
get_dist(x,-1,y);
sort(d+1,d+1+cnt);
int ans=0;
for(int i=1,j=cnt;i<j;i++){
while(d[i]+d[j]>k&&i<j)j--;
ans+=j-i;
}
return ans;
}
int dfs(int x){//dfs主框架
max_w=n1;
get_root(x,-1);
int now=root;
vis[now]=1;
int ans=0;
ans+=cal(now,0);
for(int i=0;i<G[now].size();i++){
int Next=G[now][i].first;
if(!vis[Next]){
ans-=cal(Next,G[now][i].second);
n1=size[Next];
ans+=dfs(Next);
}
}
return ans;
}
void init(int n){
for(int i=1;i<=n;i++)G[i].clear();
cnt=0;
memset(vis,0,sizeof(vis));
}
int main(){
int u,v,dis;
while(~scanf("%d%d",&n,&k)&&n&&k){
init(n);
for(int i=1;i<n;i++){
scanf("%d%d%d",&u,&v,&dis);
G[u].push_back(make_pair(v,dis));
G[v].push_back(make_pair(u,dis));
}
n1=n;
printf("%d\n",dfs(1));
}
}
//5 1
//1 2 1
//2 3 1
//3 4 1
//4 5 1

POJ 1741 点分治的更多相关文章

  1. POJ 1741 树分治

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

  2. POJ 1741 [点分治][树上路径问题]

    /* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给一棵有n个节点的树,每条边都有一个正权值,求一共有多少个点对使得它们之间路的权值和小于给定的k. 思路: <分治算法在树的路径问题中的应用 ...

  3. [八分之三的男人] POJ - 1741 点分治 && 点分治笔记

    题意:给出一棵带边权树,询问有多少点对的距离小于等于\(k\) 本题解参考lyd的算法竞赛进阶指南,讲解的十分清晰,比网上那些讲的乱七八糟的好多了 不过写起来还是困难重重(史诗巨作 打完多校更详细做法 ...

  4. 【POJ 1741】 Tree (树的点分治)

    Tree   Description Give a tree with n vertices,each edge has a length(positive integer less than 100 ...

  5. poj 1741 树的点分治(入门)

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

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

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

  7. poj 1741 楼教主男人八题之中的一个:树分治

    http://poj.org/problem? id=1741 Description Give a tree with n vertices,each edge has a length(posit ...

  8. POJ 1741.Tree and 洛谷 P4178 Tree-树分治(点分治,容斥版) +二分 模板题-区间点对最短距离<=K的点对数量

    POJ 1741. Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 34141   Accepted: 11420 ...

  9. 点分治——POJ 1741

    写的第一道点分治的题目,权当认识点分治了. 点分治,就是对每条过某个点的路径进行考虑,若路径不经过此点,则可以对其子树进行考虑. 具体可以看menci的blog:点分治 来看一道例题:POJ 1741 ...

随机推荐

  1. hdu2243 ac自动机+矩阵快速幂

    和上一题有点相似,但是这题是求包含的,并且还要求和 可以求所有情况-不包含的情况,所有情况可用矩阵快速幂求得 还有一点就是如果题目说答案余2^64,直接开unsigned long long就行了,会 ...

  2. Spring3.2.9 + JdbcTemplate 学习

    applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...

  3. Django中ORM增删改查

    新建模型 class Author(models.Model): nid = models.AutoField(primary_key=True) name=models.CharField( max ...

  4. 统计日志中ip出现的次数

    grep -r 'GET /weixin/weixin_izp/index.html' ./chunyun.access.log > ~/access.log cat access.log |a ...

  5. PHP Smarty无法解析模板文件

    /****************************************************************************** * PHP Smarty无法解析模板文件 ...

  6. 网页播放rtsp流媒体

    解决方法: 1.搭建Red5流媒体服务器(其他还有CRTMPD.NGINX-RTMP.SRS) 2.FFmpeg(其他还有live555)实现监控摄像头的RTSP协议转RTMP协议直播 3.搭建WEB ...

  7. bzoj3163 Eden的新背包问题

    多重背包,$q$ 次询问,每次问删一个物品之后花费 $x$ 能装多少物品 $n \leq 3000, x \leq 1000, q \leq 300000$ sol: 网上有很多假做法 正解应该是考虑 ...

  8. Python 2.7_多进程获取简书专题数据(一)

    学python几个月了正好练练手,发现问题不断提高,先从专题入手,爬取些数据,一开始对简书网站结构不熟悉,抓取推荐,热门,城市3个导航栏,交流发现推荐和热门是排序不同,url会重复,以及每个专题详情页 ...

  9. SQL夯实基础(五):索引的数据结构

    数据量达到十万级别以上的时候,索引的设置就显得异常重要,而如何才能更好的建立索引,需要了解索引的结构等基础知识.本文我们就来讨论索引的结构. 二叉搜索树:binary search tree 1.所有 ...

  10. Mybatis Laz-Load功能实现代码赏析(原创)

    对于Mybatis 拥有的Lazy Load(有中文翻译成延迟加载)功能,应该很同学都有听说过,今天主要与大家一起来解读一下Mybatis在Lazy Load功能的实现的代码.Lazy Load实现的 ...