正题

题目链接:https://www.luogu.com.cn/problem/AT3611


题目大意

给出nnn个点的一棵树。

现在有一张完全图,两个点之间的边权为wx+wy+dis(x,y)w_x+w_y+dis(x,y)wx​+wy​+dis(x,y)(disdisdis表示树上距离)

求这张完全图的最小生成树。

2≤n≤2×105,1≤wi,ci≤1092\leq n\leq 2\times 10^5,1\leq w_i,c_i\leq 10^92≤n≤2×105,1≤wi​,ci​≤109


解题思路

考虑可能作为最小生成树的边。

一个结论就是对于一个子图。不在最小生成森林上的边一定不在原图的最小生成树上。

这样可以考虑分治,点分治之后对于根节点xxx,其他的节点定义fx=depx+wxf_x=dep_x+w_xfx​=depx​+wx​,那么两个点之间边权就是fx+fyf_x+f_yfx​+fy​了(x,yx,yx,y属于不同子树),对于同一子树的我们也加进去,因为这是不优的边所以不会影响答案。

此时图中的最小生成森林是其他所有点连接fff值最小的点。

这样我们可以处理出nlog⁡nn\log nnlogn条可能的边,在这些边上再跑一次最小生成树就好了。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2e5+10,inf=1e18;
struct node{ll to,next,w;
}a[N<<1];
struct edge{ll x,y,w;
}e[N<<5];
ll n,tot,mins,root,ans,num,ent;
ll ls[N],f[N],siz[N],w[N],fa[N];
bool v[N];
void addl(ll x,ll y,ll w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;return;
}
void groot(ll x,ll fa){siz[x]=1;f[x]=0;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa||v[y])continue;groot(y,x);siz[x]+=siz[y];f[x]=max(f[x],siz[y]);}f[x]=max(f[x],num-siz[x]);if(f[x]<f[root])root=x;return;
}
void calc(ll x,ll fa,ll dep){f[x]=w[x]+dep;if(f[x]<f[mins])mins=x;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa||v[y])continue;calc(y,x,dep+a[i].w);}return;
}
void adde(ll x,ll fa){e[++ent]=(edge){x,mins,f[x]+f[mins]};for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa||v[y])continue;adde(y,x);}
}
void solve(ll x){v[x]=1;f[x]=w[mins=x];for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(v[y])continue;calc(y,x,a[i].w);}e[++ent]=(edge){x,mins,f[x]+f[mins]};for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(v[y])continue;adde(y,x);}ll sum=num;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(v[y])continue;num=(siz[y]>siz[x])?(sum-siz[x]):siz[y];root=0;groot(y,x);solve(root);}return;
}
bool cmp(edge x,edge y)
{return x.w<y.w;}
ll find(ll x)
{return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
signed main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld",&w[i]),fa[i]=i;for(ll i=1;i<n;i++){ll x,y,w;scanf("%lld%lld%lld",&x,&y,&w);addl(x,y,w);addl(y,x,w);}num=n;f[0]=inf;groot(1,1);solve(root);sort(e+1,e+1+ent,cmp);for(ll i=1;i<=ent;i++){ll x=e[i].x,y=e[i].y;x=find(x);y=find(y);if(x!=y)ans+=e[i].w,fa[y]=x;}printf("%lld\n",ans);return 0;
}

AT3611-Tree MST【点分治,最小生成树】相关推荐

  1. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

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

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

  3. HDU5593 ZYB's Tree 树形DP +分治

    感觉其实就是树分治,一次BC的题,感觉这次题目质量比较高,仅代表蒟蒻的看法 一次DFS获取每个点到子树的距离不大于K的点的个数, 然后一遍BFS获取从每个点父亲不大于K的的个数,层层扩展,还是想说 其 ...

  4. CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树 题目分析:考虑求解次小生成树的思路: 求出最小生成树 ans 枚举每一条非树边 ( u , ...

  5. Codeforces Round #715 (Div. 1) C. Complete the MST 补图 + 思维 + 最小生成树

    传送门 文章目录 题意: 思路 题意: 给你一张nnn个点mmm个边的图,mmm条边是给定的,要求你给未给定的边赋值一个边权,使得所有边权异或和为000,求所有满足这种情况的图中最小生成树边权和最小的 ...

  6. 2021牛客暑期多校训练营3 G-Yu Ling(Ling YueZheng) and Colorful Tree(cdq分治)

    G-Yu Ling(Ling YueZheng) and Colorful Tree HOWARLI题解 大致做法就是首先考虑哪些修改可能影响询问,当修改点权是询问的倍数时才可能影响询问.于是考虑把他 ...

  7. 【POJ - 1741】Tree(树分治,容斥,点分治,模板题)

    题干: Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist ...

  8. Tree(树分治入门)

    题目链接:http://poj.org/problem?id=1741 Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions ...

  9. Luogu P4178 Tree (点分治 + 树状数组)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P4178 Prob ...

最新文章

  1. OpenCV+python:像素运算
  2. RDKit | 化合物亚结构搜索与结果输出
  3. vector邻接表建图+dijkstra模板
  4. 了解你所不知道的SMON功能(五):Recover Dead transaction
  5. 保存您的lambda,以备不时之需-保存到文件
  6. 苹果Swift语言入门教程【中文版】
  7. 玩了5万局游戏,英伟达让GameGAN自己生成「吃豆人」,世界首创无需游戏引擎...
  8. solr dih mysql 注意事项
  9. DDS(Direct Digital Synthesizer)数字频率合成器
  10. 我们为什么存在于三维空间而不是四维空间
  11. 无向图的邻接矩阵平方的实际意义解释
  12. centos下压缩文件7z解压
  13. 如何在手机上访问自己写的网页?
  14. 爬取京东图书价格信息分析
  15. 酒店管理系统数据库设计
  16. 无线降噪蓝牙耳机对比:NANK南卡和苹果AirPods Pro哪个好用?
  17. ilove中文_iLovePDF中文版|iLovePDF(PDF万能工具箱) V0.9.662 官方版 下载_当下软件园_软件下载...
  18. java工程积累——项目管理:破窗理论
  19. Raft论文解读对话
  20. 光盘自动运行:如何编写autorun文件

热门文章

  1. matlab画孔斯曲面,CAD CAM技术基础:第五讲 孔斯曲面
  2. php 读取onedrive文件夹,oneindex
  3. linux mysql安装教程 方大帝_discuz论坛出现Can not connect to MySQL server错误的解决方法...
  4. python搭建项目结构_Django搭建项目实战与避坑细节详解
  5. java跳转画面后画面白了_如何跳转指定页面后再次跳转到另一页面或原来的页面...
  6. php获取域名方法,PHP实现获取域名的方法小结
  7. linux配置文件引用时间,linux时间设置、screen使用、命令分类、hash作用、命令引用及history命令...
  8. 前台提交数据到php mysql,建立一个基础的MySQL数据库,使用PHP来抓取和处理数据,并抛出给前台...
  9. 数据结构——哈弗曼编码问题
  10. python elasticsearch查询_python 查询Elasticsearch的小例子