博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深夜敲模板_3——树的点分治(poj1741解题报告)
阅读量:5137 次
发布时间:2019-06-13

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

具体算法可以看 2009 年的漆子超的论文

以合法点对为例:

进行分治,由于每次找的是重心,深度做多是log(n)。

大体来说就是

1:先找到该该数的重心,只需要把数遍历一遍就好了。复杂度:o(n)

2:计算各个节点到重心的距离。复杂度:o(n)

3:对重心距离进行排序,然后计算d[i]+d[j]<=k的合法点对。复杂度:排序o(nlog(n)),计算o(n)

所以总的复杂度为o(n*log(n)*log(n))

#include 
#include
#define INF 1<<30using namespace std;struct Edge{ int next,to; int w;}edge[MAXN<<1]; ///边的信息int son[MAXN]; ///该子树共有的节点数int size; ///分治以后一颗新树所包含的所有节点数int list[MAXN]; ///保存遍历的这颗树的所有节点信息int ss[MAXN]; ///保存所有节点的子树节点数的最大值int d[MAXN]; ///保存节点到根的距离bool vis[MAXN]; ///该节点有无删除int k; ///d[i]+d[j]<=kint cnt; ///边的个数int num; ///使节点值变成一个数列int ans; ///保存最终答案int head[MAXN]; ///邻接表void add_edge(int u,int v,int w){ edge[cnt].to = v; edge[cnt].w = w; edge[cnt].next = head[u]; head[u] = cnt++;}void init(){ cnt = ans =0; memset(head,-1,sizeof(head)); memset(vis,false,sizeof(vis));}///第一步,要找到重心作为根节点void dfs_size(int u,int fa){ list[size++] = u; son[u] = 1; int tem = -1; for(int i = head[u];i != -1;i = edge[i].next){ int v = edge[i].to; if(!vis[i] && v != fa){ dfs_size(v,u); son[u] += son[v]; tem = max(tem,son[v]); } } ss[u] = tem;}int getroot(int u){ size = 0; dfs_0(u,-1); int m_sum = INF,rt; for(int i = 0;i < size;i++){ int v = list[i]; ss[v] = max(ss[v],size-son[v]); if(ss[v] < m_sum){ m_sum = ss[v]; rt = v; } } return rt;}///计算所有节点到根的距离void dfs_dist(int u,int dis,int fa){ d[num++] = dis; for(int i = head[u];i != -1;i = edge[i].next){ int v = edge[i].to; if(!vis[v] && v !=fa) dfs_dist(v,dis+edge[i].w,u); }}///计算合法点对int calc(int u,int dis){ num = 0; dfs_dist(u,dis,-1); sort(d,d+num); int ret = 0; int i = 0,j = num-1; while(i < j){ while(d[i]+d[j] > k && i < j) j--; ret += (j-i); i++; } return ret;}///进行分治和计算最终答案void dfs(int u){ int rt = getroot(u); ans += calc(rt,0); vis[rt] = true; for(int i = head[rt];i != -1;i = edge[i].next){ int v = edge[i].to; if(!vis[v]){ ans -= calc(v,edge[i].w); dfs(v); } }}

转载于:https://www.cnblogs.com/hqwhqwhq/p/4555882.html

你可能感兴趣的文章
iOS 利用JSPatch 添加热补丁功能
查看>>
XML文档结构【转载】
查看>>
【已停止访问该网页】由一张图片引发的“血案”
查看>>
CSS移动
查看>>
python3写入文件时编码问题报错
查看>>
考试试卷自动生成系统
查看>>
1128. Partition into Groups
查看>>
thinkphp怎么实现图片验证码
查看>>
ABP core学习之二 IIS部署.NET CORE
查看>>
转:Yelp开发团队发布内部网站设计指南
查看>>
设计模式之抽象方法模式
查看>>
软件工程-团队作业2
查看>>
RabbitMQ系列(四)RabbitMQ事务和Confirm发送方消息确认——深入解读(转载)
查看>>
转载:dd_engi 的背包九讲
查看>>
python 操作mysql数据库
查看>>
前端-移动端h5常用<meta>属性
查看>>
致努力的自己
查看>>
mongodb基本使用
查看>>
AIX 查看CPU个数
查看>>
简述数字证书与工作流程
查看>>