poj1741 Tree

9 篇文章 0 订阅
1 篇文章 0 订阅

题目在这里呀~

点分治入门例题呀,本来打算这星期多搞几道点分治的题,可是有其心而力不足啊。

emm这星期做了四五道莫比乌斯反演,还有两套模拟赛,那点分治放在下星期找一天做吧。

这题题解先写好吧。


题意:给你一棵树,和树上每条边的长度,问有多少对点满足两点间的距离小于等于k。

稍微说一下点分治的过程。

1、找重心

2、处理询问

3、分治


此题里就是要处理从一个子树到另一个子树距离小于等于k。

那么可以先处理出根到子树每个点的深度,然后排序类似于两个指针做。

就可以轻松搞定啦~具体还看代码吧。




#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 10000+115
using namespace std;
int cnt,n,m,ALL,ans,root,x,y,z,tot,head[N],Next[N+N],len[N+N],vet[N+N],deep[N],d[N],size[N],f[N],vis[N];
const int inf=1e9;
inline void add_edge(int x,int y,int z){
	vet[++cnt]=y;Next[cnt]=head[x];len[cnt]=z;head[x]=cnt;
}
void get_root(int x,int fa){
	f[x]=0;size[x]=1;
	for(int i=head[x];i;i=Next[i])
		if(!vis[vet[i]] && vet[i] != fa){
			get_root(vet[i],x);size[x]+=size[vet[i]];
			f[x]=max(f[x],size[vet[i]]);
		}
	f[x]=max(f[x],ALL-size[x]);
	if(f[root]>f[x]) root=x;
}
void get_deep(int x,int fa){
	d[++tot]=deep[x];
	for(int i=head[x];i;i=Next[i])
		if(!vis[vet[i]] && vet[i] != fa) deep[vet[i]]=deep[x]+len[i],get_deep(vet[i],x);
}
inline int calc(int x){
	tot=0;get_deep(x,-1);
	sort(d+1,d+tot+1);
	int i=1,j=tot,sum=0;
	while(i<j){
		if(d[i]+d[j]<=m) sum+=j-i,i++;
		else j--;
	}
	return sum;
}
void dfs(int x){
	deep[x]=0;vis[x]=1;
	ans+=calc(x);
	for(int i=head[x];i;i=Next[i])
		if(!vis[vet[i]]){
			deep[vet[i]]=len[i];
			ans-=calc(vet[i]);
			ALL=size[vet[i]];
			root=0;
			get_root(vet[i],-1);
			dfs(root);
		}
}
int main()
{
	while(scanf("%d%d",&n,&m) && (n || m)){
		memset(head,0,sizeof(head));
		memset(vis,0,sizeof(vis));
		cnt=0;ans=0;
		for(int i=1;i<n;i++){scanf("%d%d%d",&x,&y,&z);add_edge(x,y,z);add_edge(y,x,z);}
		f[0]=inf,ALL=n;
		root=0;get_root(1,-1);
		dfs(root);
		printf("%d\n",ans);
	}
	return 0;
}









1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值