入门题,算是对树分治有了初步的理解吧。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define MS0(a) memset(a,0,sizeof(a))using namespace std;typedef long long ll;
const int maxn=20100;
const int INF=1e9+10;int n,k;
int u,v,w;
struct Edge
{int v,w;
};
vector<Edge> G[maxn];
vector<int> d;
bool vis[maxn];void dfs_d(int u,int f,int dep)
{for(int i=0;i<G[u].size();i++){int v=G[u][i].v;if(v==f||vis[v]) continue;dfs_d(v,u,dep+G[u][i].w);d.push_back(dep+G[u][i].w);}
}void dfs_ds(int u,int f,int dep)
{d.push_back(dep);for(int i=0;i<G[u].size();i++){int v=G[u][i].v;if(v==f||vis[v]) continue;dfs_ds(v,u,dep+G[u][i].w);}
}///---get_root
int rt,balance;
int get_root(int u,int f,int sz)
{int cnt=1,balance1=0;for(int i=0;i<G[u].size();i++){int v=G[u][i].v;if(v==f||vis[v]) continue;int tmp=get_root(v,u,sz);cnt+=tmp;balance1=max(balance1,tmp);}balance1=max(balance1,sz-cnt);if(balance1<balance){rt=u;balance=balance1;}return cnt;
}int solve(int u)
{rt=u,balance=INF;int sz=get_root(u,0,n);rt=u,balance=INF;get_root(u,0,sz);u=rt;vis[u]=1;int res=0;d.clear();dfs_d(u,0,0);sort(d.begin(),d.end());for(int i=0;i<d.size();i++){if(d[i]<=k) res++;}for(int l=0,r=(int)d.size()-1;l<r;l++){while(r>l&&d[r]+d[l]>k) r--;res+=r-l;}for(int i=0;i<G[u].size();i++){int v=G[u][i].v;if(vis[v]) continue;d.clear();dfs_ds(v,u,G[u][i].w);sort(d.begin(),d.end());for(int l=0,r=(int)d.size()-1;l<r;l++){while(r>l&&d[r]+d[l]>k) r--;res-=r-l;}}for(int i=0;i<G[u].size();i++){int v=G[u][i].v;if(vis[v]) continue;res+=solve(v);}return res;
}void play()
{freopen("in.txt","w",stdout);n=10000;k=1000000;cout<<n<<" "<<k<<endl;for(int i=1;i<n;i++){cout<<i<<" "<<i+1<<" "<<1<<endl;}cout<<0<<" "<<0<<endl;
}int main()
{//play();return 0;//freopen("in.txt","r",stdin);while(~scanf("%d%d",&n,&k)){if(n==0&&k==0) break;REP(i,1,n) G[i].clear();REP(i,1,n-1){scanf("%d%d%d",&u,&v,&w);G[u].push_back({v,w});G[v].push_back({u,w});}MS0(vis);printf("%d\n",solve(1));}return 0;
}

View Code

对于点分治,我的理解就是进行logn次暴力,每次暴力的复杂度为n,总复杂度为n*logn。

转载于:https://www.cnblogs.com/--560/p/5277061.html

poj1741 Tree 点分治相关推荐

  1. POJ1741 Tree(树分治——点分治)题解

    题意:给一棵树,问你最多能找到几个组合(u,v),使得两点距离不超过k. 思路:点分治,复杂度O(nlogn*logn).看了半天还是有点模糊. 显然,所有满足要求的组合,连接这两个点,他们必然经过他 ...

  2. POJ1741 Tree 树中点对统计【树分治入门】

    算法合集之<分治算法在树的路径问题中的应用> 论文下载地址 树被定义为没有圈的连通图,有几个性质 在树中去掉一条边后,得到的图是不连通的 在树中添加一条边后,一定存在一条边 树的每一对顶点 ...

  3. POJ1741 Tree(点分治)

    嘟嘟嘟 没错,这一道最经典的点分治模板题. 题意:求树上两点间距离\(\leqslant k\)的点对个数. 点分治这东西我好早就听说了,然后一两个月前也学了一下,不过只是刷了个模板,没往深处学. 对 ...

  4. [poj1741 Tree]树上点分治

    题意:给一个N个节点的带权树,求长度小于等于K的路径条数 思路:选取一个点作为根root,假设f(root)是当前树的答案,那么答案来源于两部分: (1)路径不经过root,那么就是完全在子树内,这部 ...

  5. 【楼天城男人八题】【树分治|Treap+启发式合并】POJ1741 Tree

    题面在这里 待我先膜拜一下楼教主-- 首先这题是很明显的树分治 想说点什么却发现已经没什么好说了 然后我们来看另一种解法:平衡树乱搞 这里用的是Treap实现 对于每个节点,用Treap记录该子树每个 ...

  6. POJ1741 Tree(树分治)

    题意: 求树上距离小于等于K的点对有多少个 思路: 每次分治,我们首先算出重心,为了计算重心,需要进行两次dfs,第一次把以每个结点为根的子树大小求出来,第二次是从这些结点中找重心 找到重心后,需要统 ...

  7. 【CodeForces】914 E. Palindromes in a Tree 点分治

    [题目]E. Palindromes in a Tree [题意]给定一棵树,每个点都有一个a~t的字符,一条路径回文定义为路径上的字符存在一个排列构成回文串,求经过每个点的回文路径数.n<=2 ...

  8. HDU 4812 D Tree (点分治) (2013ACM/ICPC亚洲区南京站现场赛)

    HDU 4812 D Tree 思路 点对距离相等并且要求输出字典序最小的点对,距离相等不就是点分治裸题了嘛, 照着这个思路出发我们只要记录下所有点对是满足要求的,然后再去找字典序最小的点对就行了, ...

  9. Codeforces Round #507 (Div. 1) D. You Are Given a Tree 根号分治 + dp

    传送门 题意: 有一颗nnn个节点的树,其中一个简单路径集合被称为kkk合法当且仅当: 树的每个节点至多属于一条路径,且每条路径恰好包含kkk个点. 对于k∈[1,n]k\in [1,n]k∈[1,n ...

最新文章

  1. 动态规划——区间dp
  2. SQL Server 查找统计信息的采样时间与采样比例
  3. 深入理解BN、合并conv+BN公式推导
  4. html5点击切换选项卡,简单纯js实现点击切换TAB标签实例
  5. 郭凯天:中国公益慈善行业数字化观察与思考
  6. 对int array进行排序
  7. Python的发展前景在哪?怎么样让Python程序员持续发展?
  8. Visual Studio 2013 、Matlab 2014产品密钥
  9. iOS 开发 多线程详解之线程生命周期控制
  10. KY-RTI分布仿真技术:第六章 Java程序设计
  11. 平安科技软件+金山WPS测试面试题
  12. 趣图:没想到 CSS 深灰色是这样的
  13. git log 详解
  14. 鸡兔同笼问题。上有头30个,下有脚90只,问鸡兔各有多少只。
  15. 为什么PDF转成Word后是图片,怎么才能修改?
  16. h5活动是什么意思_H5页面到底是什么?
  17. 2021年中国InGaAs+APD接收机市场趋势报告、技术动态创新及2027年市场预测
  18. 优思学院|权力下放,给下属自由发挥的空间
  19. 爬虫实战1:爬取糗事百科段子
  20. 安天每日安全简讯20160712

热门文章

  1. cnn卷积神经网络应用_卷积神经网络(CNN):应用的核心概念
  2. kernel并发控制:自旋锁、互斥体、中断屏蔽
  3. mysql字符集设置_mysql字符集设置
  4. jquery上传图片_文件上传三种方式
  5. 内存泄漏java例子_一次线上Java应用内存泄漏分析实例
  6. php在数据库中上传图片格式,如何上传图片并在php中保存数据库中的URL
  7. 重构 pdf_三维温度场的重构方法,更准确地监测储能系统的电池堆内部温度
  8. c语言 pow优化_c程序代码优化的一些方法
  9. Tensorflow官方文档---起步 MNIST示例
  10. 学习数字图像处理经验谈