[poj1741][tree] (树/点分治)
Description
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
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
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] (树/点分治)的更多相关文章
- POJ1741——Tree(树的点分治)
1 /* *********************************************** 2 Author :kuangbin 3 Created Time :2013-11-17 1 ...
- POJ 1741 Tree 树的分治
原题链接:http://poj.org/problem?id=1741 题意: 给你棵树,询问有多少点对,使得这条路径上的权值和小于K 题解: 就..大约就是树的分治 代码: #include< ...
- POJ1741 Tree 树分治模板
http://poj.org/problem?id=1741 题意:一棵n个点的树,每条边有距离v,求该树中距离小于等于k的点的对数. dis[y]表示点y到根x的距离,v代表根到子树根的距离 ...
- poj 1741 Tree (树的分治)
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 30928 Accepted: 10351 Descriptio ...
- POJ1741 tree 【点分治】
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 25286 Accepted: 8421 Description ...
- POJ 1741 Tree 树的分治(点分治)
题目大意:给出一颗无根树和每条边的权值,求出树上两个点之间距离<=k的点的对数. 思路:树的点分治.利用递归和求树的重心来解决这类问题.由于满足题意的点对一共仅仅有两种: 1.在以该节点的子树中 ...
- [poj1741 Tree]树上点分治
题意:给一个N个节点的带权树,求长度小于等于K的路径条数 思路:选取一个点作为根root,假设f(root)是当前树的答案,那么答案来源于两部分: (1)路径不经过root,那么就是完全在子树内,这部 ...
- E. Alternating Tree 树点分治|树形DP
题意:给你一颗树,然后这颗树有n*n条路径,a->b和b->a算是一条,然后路径的权值是 vi*(-1)^(i+1) 注意是点有权值. 从上头往下考虑是点分治,从下向上考虑就是树形DP, ...
- POJ1741 tree (点分治模板)
题目大意: 给一棵有 n 个顶点的树,每条边都有一个长度(小于 1001 的正整数).定义 dist(u,v)=节点 u 和 v 之间的最小距离.给定一个整数 k,对于每一对 (u,v) 顶点当且仅当 ...
随机推荐
- [.Net] 手把手带你将自己打造的类库丢到 NuGet 上
手把手带你将自己打造的类库丢到 NuGet 上 序 我们习惯了对项目右键点击“引用”,选择“管理NuGet 程序包”来下载第三方的类库,可曾想过有一天将自己的打造的类库放到 NuGet 上,让第三者下 ...
- Oracle 11g静默安装简明版
环境:RHEL 6.5 + Oracle 11.2.0.4 1. 初步处理应答文件 2. 静默安装软件 3. 静默安装监听 4. 静默dbca建库 说明: 本文默认安装软件前的步骤已经设置完毕 如果没 ...
- FFmpeg学习4:音频格式转换
前段时间,在学习试用FFmpeg播放音频的时候总是有杂音,网上的很多教程是基于之前版本的FFmpeg的,而新的FFmepg3中audio增加了平面(planar)格式,而SDL播放音频是不支持平面格式 ...
- 详解web容器 - Jetty与Tomcat孰强孰弱
Jetty 基本架构 Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器.它有一个基本数据模型,这个数据模型就是 Handler(处理器 ...
- Rafy 框架 - 通用查询条件(CommonQueryCriteria)
在应用开发过程中,有 80% 的场景下,开发者所需要的实体查询,查询条件中其实都是一些简单的属性匹配,又或是一些属性匹配的简单组合.Rafy 为这样的场景提供了更为方便使用的 API:CommonQu ...
- 浅谈Slick(4)- Slick301:我的Slick开发项目设置
前面几篇介绍里尝试了一些Slick的功能和使用方式,看来基本可以满足用scala语言进行数据库操作编程的要求,而且有些代码可以通过函数式编程模式来实现.我想,如果把Slick当作数据库操作编程主要方式 ...
- GJM: 设计模式 - 模板方法模式(Template Method)
生活中的模板 一.在银行办理业务 Step1:进门取号 Step2:填写单据 Step3:等待叫号 Step4:窗口办理 二.奥运会开幕式 第一步:升国旗奏国歌 第二步:领导人致辞讲话 第三部: 文艺 ...
- push方法的兼容性问题
在IE8及以下中,不支持aplly方法中的第二个参数是 伪数组 需要对push方法进行封装. 将 push 的判断,放入一个沙箱中: 好处:在页面加载的时候就会执行这段代码,保证了代码只会检测一次 以 ...
- 特大喜讯,View and Data API 现在支持中文界面了
大家经常会问到,使用View and Data API怎么做界面的本地化,来显示中文,现在好消息来了,从v1.2.19起,View and Data API开始支持多国语言界面了.你需要制定版本号为v ...
- SDK接入(2)之Android Google Play内支付(in-app Billing)接入
SDK接入(2)之Android Google Play内支付(in-app Billing)接入 继上篇SDK接入(1)之Android Facebook SDK接入整理完Facebook接入流程之 ...