博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 1741 树的点分治(入门)
阅读量:7015 次
发布时间:2019-06-28

本文共 2857 字,大约阅读时间需要 9 分钟。

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

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

5 41 2 31 3 11 4 23 5 10 0

Sample Output

8

 

/*poj 1741 树的点分治(入门)problem:给一棵边带权树,问两点之间的距离小于等于K的点对有多少个solve: 随便找的博客学习下大致思路,对当前树先求其重心为根节点,然后找出所有点到根节点的距离. 然后就能计算出有多少的的和<= k. 但是这两个点有可能来自同一个子树,所以在后面计算中减去,就能计算出过当前根节点的所有对.以同样的方法计算子树的情况,递推下去就行.重心是为了让最大子树的节点数最小,从而增加效率.(个人理解)hhh-2016-08-22 20:00:18*/#pragma comment(linker,"/STACK:124000000,124000000")#include 
#include
#include
#include
#include
#include
#include
#include
#define lson i<<1#define rson i<<1|1#define ll long long#define clr(a,b) memset(a,b,sizeof(a))#define key_val ch[ch[root][1]][0]#define inf 0x3FFFFFFFFFFFFFFFLLusing namespace std;const int maxn = 100010;struct node{ int to,w; node() {}; node(int v,int _w):to(v),w(_w) {};};vector
q[maxn];int n,k,s[maxn],f[maxn],root,d[maxn],ans,limit;int Size;bool vis[maxn];vector
ta;void get_root(int now,int fa){ int v; s[now] = 1,f[now] = 0; for(int i = 0;i < q[now].size();i++) { if( (v=q[now][i].to) == fa || vis[v]) continue; get_root(v,now); s[now] += s[v]; f[now] = max(f[now],s[v]); } f[now] = max(f[now],Size - s[now]); if(f[now] < f[root]) root = now;}void dfs(int now,int fa){ int v; ta.push_back(d[now]); s[now] = 1; for(int i = 0;i < q[now].size();i++) { if( (v=q[now][i].to) == fa || vis[v]) continue; d[v] = d[now] + q[now][i].w; dfs(v,now); s[now] += s[v]; }}int cal(int now,int begi){ ta.clear(),d[now] = begi; dfs(now,0); sort(ta.begin(),ta.end()); int cnt = 0; for(int l = 0,r=ta.size()-1;l
< q[now].size(); i++) { if(!vis[v = q[now][i].to]) { ans -= cal(v,q[now][i].w); f[0] = Size = s[v]; get_root(v,root = 0); work(root); } }}int main(){ while(scanf("%d%d",&n,&limit) == 2) { if(!n && !limit) break; for(int i = 0;i <= n;i++) q[i].clear(); memset(vis,0,sizeof(vis)); int a,b,c; for(int i = 1;i < n;i++) { scanf("%d%d%d",&a,&b,&c); q[a].push_back(node(b,c)); q[b].push_back(node(a,c)); } f[0] = Size = n; get_root(1,root = 0); ans = 0; work(root); printf("%d\n",ans); } return 0;}

  

转载于:https://www.cnblogs.com/Przz/p/5812337.html

你可能感兴趣的文章
[iOS] 从 application delegate 引申三点
查看>>
深入理解Java虚拟机(一)
查看>>
实战Android 上推下拉——隐藏、显示ActionBar
查看>>
PowerShell 多线程测试IP端口
查看>>
使用SQL Server 2008 Extended Events SSMS Addin轻松管理XEvents
查看>>
Django-celery 安装及使用测试
查看>>
优秀UML制图开源工具--ArgoUML
查看>>
没有服务台,就没有ITSM
查看>>
加点自已内容的新内核下L7-FILTER的应用实例!
查看>>
QQ-weiyun(微云)-云储存
查看>>
微信公众帐号开发教程第3篇-开发模式启用及接口配置(转)
查看>>
.NET项目web自动化测试实战——Selenium 2.0
查看>>
Asp.Net SignalR - 持久连接类
查看>>
11.8. NAT
查看>>
火车票秒杀攻略
查看>>
关于Asp.Net中FileUpload控件属性PostedFile.ContentType的提示
查看>>
使用shell批量生成数据整合式迁移的脚本
查看>>
Unicode字符编码标准
查看>>
云计算就像是产业链的重新组合
查看>>
第三代北斗芯片发布 2020年北斗计划向全球提供服务
查看>>