poj1741 Tree 点分治
入门题,算是对树分治有了初步的理解吧。
#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 点分治相关推荐
- POJ1741 Tree(树分治——点分治)题解
题意:给一棵树,问你最多能找到几个组合(u,v),使得两点距离不超过k. 思路:点分治,复杂度O(nlogn*logn).看了半天还是有点模糊. 显然,所有满足要求的组合,连接这两个点,他们必然经过他 ...
- POJ1741 Tree 树中点对统计【树分治入门】
算法合集之<分治算法在树的路径问题中的应用> 论文下载地址 树被定义为没有圈的连通图,有几个性质 在树中去掉一条边后,得到的图是不连通的 在树中添加一条边后,一定存在一条边 树的每一对顶点 ...
- POJ1741 Tree(点分治)
嘟嘟嘟 没错,这一道最经典的点分治模板题. 题意:求树上两点间距离\(\leqslant k\)的点对个数. 点分治这东西我好早就听说了,然后一两个月前也学了一下,不过只是刷了个模板,没往深处学. 对 ...
- [poj1741 Tree]树上点分治
题意:给一个N个节点的带权树,求长度小于等于K的路径条数 思路:选取一个点作为根root,假设f(root)是当前树的答案,那么答案来源于两部分: (1)路径不经过root,那么就是完全在子树内,这部 ...
- 【楼天城男人八题】【树分治|Treap+启发式合并】POJ1741 Tree
题面在这里 待我先膜拜一下楼教主-- 首先这题是很明显的树分治 想说点什么却发现已经没什么好说了 然后我们来看另一种解法:平衡树乱搞 这里用的是Treap实现 对于每个节点,用Treap记录该子树每个 ...
- POJ1741 Tree(树分治)
题意: 求树上距离小于等于K的点对有多少个 思路: 每次分治,我们首先算出重心,为了计算重心,需要进行两次dfs,第一次把以每个结点为根的子树大小求出来,第二次是从这些结点中找重心 找到重心后,需要统 ...
- 【CodeForces】914 E. Palindromes in a Tree 点分治
[题目]E. Palindromes in a Tree [题意]给定一棵树,每个点都有一个a~t的字符,一条路径回文定义为路径上的字符存在一个排列构成回文串,求经过每个点的回文路径数.n<=2 ...
- HDU 4812 D Tree (点分治) (2013ACM/ICPC亚洲区南京站现场赛)
HDU 4812 D Tree 思路 点对距离相等并且要求输出字典序最小的点对,距离相等不就是点分治裸题了嘛, 照着这个思路出发我们只要记录下所有点对是满足要求的,然后再去找字典序最小的点对就行了, ...
- 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 ...
最新文章
- 动态规划——区间dp
- SQL Server 查找统计信息的采样时间与采样比例
- 深入理解BN、合并conv+BN公式推导
- html5点击切换选项卡,简单纯js实现点击切换TAB标签实例
- 郭凯天:中国公益慈善行业数字化观察与思考
- 对int array进行排序
- Python的发展前景在哪?怎么样让Python程序员持续发展?
- Visual Studio 2013 、Matlab 2014产品密钥
- iOS 开发 多线程详解之线程生命周期控制
- KY-RTI分布仿真技术:第六章 Java程序设计
- 平安科技软件+金山WPS测试面试题
- 趣图:没想到 CSS 深灰色是这样的
- git log 详解
- 鸡兔同笼问题。上有头30个,下有脚90只,问鸡兔各有多少只。
- 为什么PDF转成Word后是图片,怎么才能修改?
- h5活动是什么意思_H5页面到底是什么?
- 2021年中国InGaAs+APD接收机市场趋势报告、技术动态创新及2027年市场预测
- 优思学院|权力下放,给下属自由发挥的空间
- 爬虫实战1:爬取糗事百科段子
- 安天每日安全简讯20160712
热门文章
- cnn卷积神经网络应用_卷积神经网络(CNN):应用的核心概念
- kernel并发控制:自旋锁、互斥体、中断屏蔽
- mysql字符集设置_mysql字符集设置
- jquery上传图片_文件上传三种方式
- 内存泄漏java例子_一次线上Java应用内存泄漏分析实例
- php在数据库中上传图片格式,如何上传图片并在php中保存数据库中的URL
- 重构 pdf_三维温度场的重构方法,更准确地监测储能系统的电池堆内部温度
- c语言 pow优化_c程序代码优化的一些方法
- Tensorflow官方文档---起步 MNIST示例
- 学习数字图像处理经验谈