【POJ】【1741】/【BZOJ】【1468】Tree
点分治
怎么又一道叫Tree的题目……真是醉了。
本题为漆子超论文《分治算法在树的路径问题中的应用》例一
题解 : http://blog.csdn.net/sdj222555/article/details/7893862
http://blog.csdn.net/yang_7_46/article/details/9966455
既然是点分治嘛,为了保证复杂度不退化,必然要找树的重心,这一步可以通过一次dfs实现:以任意节点为根(方便起见就选1号节点了)求出每个节点子树大小,那么当前节点就将整棵树分为size[x],n-size[x]两部分,我们取较大的那一部分作为当前节点的子树大小(只是记录个值而已, 不必在意具体哪个是根),然后我们可以在dfs到每个节点时与全局变量root比较一下 f[x]和f[root] 如果f[x]<f[root] 则root=x(这里用root表示重心)(由于f[x]>=n/2,所以f[x]最小的那个x就是将整棵树分的最平均的那个“重心”)
找到重心后,需要统计所有点(n-1个)到重心的距离,统计有多少对点之间的距离小于等于k。同样用一次dfs实现,然后将所有节点到重心的距离存在一个数组里,进行一次快排~然后利用单调性,一次相向搜索在O(n)时间内解决。但是这是有额外计数的:两点在同一子树里的是不能算的,所以减去两点在同一子树里的情况(递归求解子树的时候会再算一次)。当然还是要递归算各子树内的点对啦~
//POJ 1741
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
void read(int &v){
v=; int sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
v*=sign;
}
/******************tamplate*********************/
const int N=;
struct edge{
int to,l;
};
int n,k,size,s[N],f[N],root,d[N],ans,K;
vector<edge>G[N];
vector<int>dep;
bool vis[N]; void getroot(int x,int fa){
int y;
s[x]=;f[x]=;
rep(i,G[x].size()){
y=G[x][i].to;
if (y!=fa && !vis[y]){
getroot(y,x);
s[x]+=s[y];
f[x]=max(f[x],s[y]);
}
}
f[x]=max(f[x],size-s[x]);
if (f[x]<f[root]) root=x;
}
void getdep(int x,int fa){
int y;
dep.pb(d[x]);
s[x]=;
rep(i,G[x].size()){
y=G[x][i].to;
if (y!=fa && !vis[y]){
d[y]=d[x]+G[x][i].l;
getdep(y,x);
s[x]+=s[y];
}
}
}
int calc(int x,int init){
dep.clear(); d[x]=init;
getdep(x,);
sort(dep.begin(),dep.end());
int ans=;
for(int l=,r=dep.size()-; l<r; )
if (dep[l]+dep[r]<=k) ans+=r-l++;
else r--;
return ans;
}
void work(int x){
int y;
ans+=calc(x,);
vis[x]=;
rep(i,G[x].size()){
y=G[x][i].to;
if (!vis[y]){
ans-=calc(y,G[x][i].l);
f[]=size=s[y];
getroot(y,root=);
work(root);
}
}
}
int main(){
// freopen("1741.in","r",stdin);
while(scanf("%d%d",&n,&k)==){
if (n== && K==) break;
int x,y,z;
F(i,,n) G[i].clear();
memset(vis,,sizeof vis);
F(i,,n){
read(x); read(y); read(z);
G[x].pb((edge){y,z}); G[y].pb((edge){x,z});
}
f[]=size=n;
getroot(,root=);
ans=;
work(root);
printf("%d\n",ans);
}
return ;
}
1468: Tree
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 606 Solved: 317
[Submit][Status][Discuss]
Description
Input
接下来n-1行边描述管道,按照题目中写的输入
接下来是k
Output
Sample Input
1 6 13
6 3 9
3 5 7
4 1 3
2 4 20
4 7 2
10
Sample Output
HINT
Source
【POJ】【1741】/【BZOJ】【1468】Tree的更多相关文章
- bzoj 2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...
- 【链表】BZOJ 2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111[Submit][S ...
- BZOJ 2287: 【POJ Challenge】消失之物( 背包dp )
虽然A掉了但是时间感人啊.... f( x, k ) 表示使用前 x 种填满容量为 k 的背包的方案数, g( x , k ) 表示使用后 x 种填满容量为 k 的背包的方案数. 丢了第 i 个, 要 ...
- 【POJ 1741】Tree
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 11570 Accepted: 3626 Description ...
- bzoj 2288 【POJ Challenge】生日礼物 双向链表+堆优化
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1003 Solved: 317[Submit][ ...
- 【BZOJ 2288】 2288: 【POJ Challenge】生日礼物 (贪心+优先队列+双向链表)
2288: [POJ Challenge]生日礼物 Description ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超 ...
- BZOJ 2287 【POJ Challenge】消失之物(DP+容斥)
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 986 Solved: 572[Submit][S ...
- 【poj 1984】&【bzoj 3362】Navigation Nightmare(图论--带权并查集)
题意:平面上给出N个点,知道M个关于点X在点Y的正东/西/南/北方向的距离.问在刚给出一定关系之后其中2点的曼哈顿距离((x1,y1)与(x2,y2):l x1-x2 l+l y1-y2 l),未知则 ...
- bzoj2287【POJ Challenge】消失之物 缺一01背包
bzoj2287[POJ Challenge]消失之物 缺一01背包 链接 bzoj 思路 分治solve(l,r,arr)表示缺少物品\([l,r]\)的dp数组arr. 然后solve(l,mid ...
- 【poj 1988】Cube Stacking(图论--带权并查集)
题意:有N个方块,M个操作{"C x":查询方块x上的方块数:"M x y":移动方块x所在的整个方块堆到方块y所在的整个方块堆之上}.输出相应的答案. 解法: ...
随机推荐
- Android数据库之SQLite数据库
Android数据库之SQLite数据库 导出查看数据库文件 在android中,为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data ...
- iOS学习笔记--OC系列(1)
前言 从学校毕业进入公司工作已经第3个年头了,回顾这3年的经历,有种迷茫的感觉.在公司我主要是做零售业公司的系统维护,接触的主要是Oracle的Database的东西.但是业务知识和oracle,都没 ...
- iOS-RunLoop,为手机省电,节省CPU资源,程序离不开的机制
RunLoop是什么?基本操作是什么? 1.RunLoop的作用 RunLoop可以: 保持程序的持续运行 处理App中的各种事件(比如触摸事件.定时器事件.Selector事件) 节省CPU资源,提 ...
- 暑假集训(4)第五弹——— 数论(hdu1222)
题意概括:那天以后,你好说歹说,都快炼成三寸不烂之舍之际,小A总算不在摆着死人脸,鼓着死鱼眼.有了点恢复的征兆.可孟子这家伙说的话还是有点道理,那什么天将降....额,总之,由于贤者法阵未完成,而小A ...
- 必须知道的.NET FrameWork
这部分内容呢,对普通开发者来说,意义不是特别大.但是作为一个有情怀的开发者,应该追根溯源,懂一些自己用的工具, 的粗浅知识.并且这部分内容可以用来个HR吹嘘一下自己的情怀.基本就是这样. .NET生成 ...
- 四位数码管SH5461AS的问题,arduino学习实测.
arduino入门教程到第16课遇到些问题.效果一直是混乱的状态. 琢磨了半天发现一些问题,和大家分享下 1)接线图,原图没有问题,只是比较含糊,线比较多不好看. 我用红色数字标示数码管的12个脚,并 ...
- Linux下iptables拦截Nginx的问题
环境:CentOS 6.4 X64,Nginx 1.5.3 问题:配置好Nginx后,加入了“iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT” ...
- Spark菜鸟学习营Day3 RDD编程进阶
Spark菜鸟学习营Day3 RDD编程进阶 RDD代码简化 对于昨天练习的代码,我们可以从几个方面来简化: 使用fluent风格写法,可以减少对于中间变量的定义. 使用lambda表示式来替换对象写 ...
- 第22章 项目3:万能的XML
Mix-in:混入类,是一种Python程序设计中的技术,作用是在运行期间动态改变类的基类或类的方法,从而使得类的表现可以发生变化.可以用在一个通用类接口中. 在实践一个解析XML文件的实践中,体会动 ...
- (转)使用getevent监听Android输入设备文件
尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 上一节Android事件分发完全解 ...