[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) 顶点当且仅当 ...
随机推荐
- ORACLE快速彻底Kill掉的会话
在ORACLE数据库当中,有时候会使用ALTER SYSTEM KILL SESSION 'sid,serial#'杀掉一个会话进程,但是使用这个SQL语句杀掉会话后,数据库并不会立即释放掉相关的资源 ...
- Js ==和===的区别
===判断: Undefined === Undefined,返回 true Null === Null,返回 true null == undefined,返回 false NaN === NaN, ...
- Angular2 小贴士 Name
Angular2 正式版已经发布了一个月了,我也是通过各种方式在进行验证是否可以满足我们的需求,今天我就发现了一个问题.现在我们来一起说明一下,这个可能不算是bug,而应该需要我们记住就可以了. 我们 ...
- Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】
原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...
- 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持
在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreS ...
- 用大白话聊聊JavaSE -- 如何理解Java Bean(一)
首先,在开始本章之前,先说一个总的概念:所谓的Java Bean,就是一个java类,编译后成为了一个后缀名是 .class的文件.这就是Java Bean,很多初学者,包括当年的我自己,总是被这些专 ...
- datatables中的Options总结(1)
datatables中的Options总结(1) 最近一直研究dataTables插件,下面是总结的所有的选项内容,用了帮助学习datatables插件. 这些选项的配置在$().Datatable( ...
- jQuery Raty 星级评分
在线实例 实例演示 使用方法 <div id="star"></div> 复制 $('#star').raty(); 复制 你只需要有一个 div构建Rat ...
- 使用tomcat manager 管理和部署项目
在部署tomcat项目的时候,除了把war文件直接拷贝到tomcat的webapp目录下,还有一种方法可以浏览器中管理和部署项目,那就是使用tomcat manager. 默认情况下,tomcat m ...
- 利用CSS背景颜色属性使父级div背景透明同时避免子级标签透明。
实现背景色透明效果的代码 实现各个浏览器中具备良好的透明特性的效果,IE中使用私有滤镜filter,高端浏览器使用CSS3中的rgba属性. 输入十六进制的颜色值以及透明度,自动在IE的过渡滤镜以及C ...