【学习笔记】CODE FESTIVAL 2017 Final G. Tree MST

这篇具有很好参考价值的文章主要介绍了【学习笔记】CODE FESTIVAL 2017 Final G. Tree MST。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

感觉是一道典中典题目!

首先发现一个性质,假设 ( x , y ) (x,y) (x,y)在最终的答案当中,那么对于 x → y x\to y xy这条链上的任意节点 z z z,应该满足 w z ≥ min ⁡ ( w x , w y ) w_z\ge \min(w_x,w_y) wzmin(wx,wy)

这样我们每次把权值最小的点取出来作为根,然后把所有可能有用的边找出来,最后跑 kruskal \text{kruskal} kruskal算法,但是复杂度可能不对!

我们发现这样一个类似于 点分树 的结构有非常好的性质,于是问题转化为求一个子树内 d i s x + w x dis_x+w_x disx+wx的最小值。

但是这样是有问题的。我们想一想一般的点分树能否实现上述功能?

发现这样是可以的。具体来说只要把所有点和 d i s x + w x dis_x+w_x disx+wx最小的那个点连起来就好了,因为两个点之间边的边权就是点权相加,因此所有点都只可能会和点权最小的那个点连边。

但是就是没想到\kk。以为跨分治中心的边不好处理所以就卡住了。。。

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

remark \text{remark} remark 为什么这道题目可以用点分治解决?因为和路径相关!但是我以为最开始那个结论很重要。。。还是太菜了。。。文章来源地址https://www.toymoban.com/news/detail-558434.html

#include<bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define pb push_back
#define db double
#define inf 0x3f3f3f3f
using namespace std;
const int N=2e5+5;
vector<pair<int,int>>G[N];
int n,rt,num,ps,sz[N],ban[N],fa[N];
ll w[N],dis[N],res;
vector<pair<ll,pair<int,int>>>edges;
void dfs(int u,int topf){
    sz[u]=1;
    for(auto v:G[u]){
        if(v.fi==topf||ban[v.fi])continue;
        dfs(v.fi,u),sz[u]+=sz[v.fi];
    }
}
void dfs2(int u,int topf){
    for(auto v:G[u]){
        if(v.fi==topf||ban[v.fi])continue;
        dfs2(v.fi,u);
    }
    if(rt==-1&&sz[u]>=(num+1)/2)rt=u;
}
void locate(int u,int topf){
    if(ps==-1||dis[u]+w[u]<dis[ps]+w[ps])ps=u;
    for(auto v:G[u]){
        if(v.fi==topf||ban[v.fi])continue;
        dis[v.fi]=dis[u]+v.se,locate(v.fi,u);
    }
}
void connect(int u,int topf){
    edges.pb(make_pair(dis[ps]+w[ps]+dis[u]+w[u],make_pair(ps,u)));
    for(auto v:G[u]){
        if(v.fi==topf||ban[v.fi])continue;
        connect(v.fi,u);
    }
}
void solve(int u){
    dfs(u,0),rt=-1,num=sz[u],dfs2(u,0);
    dis[rt]=0,ps=-1,locate(rt,0);
    connect(rt,0);ban[rt]=1;
    for(auto v:G[rt])if(!ban[v.fi])solve(v.fi);
}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
    cin>>n;for(int i=1;i<=n;i++)cin>>w[i];
    for(int i=1;i<n;i++){
        int x,y,z;cin>>x>>y>>z;
        G[x].pb(make_pair(y,z));
        G[y].pb(make_pair(x,z));
    }
    solve(1);
    sort(edges.begin(),edges.end());
    for(int i=1;i<=n;i++)fa[i]=i;
    for(auto e:edges){
        ll z=e.fi;int x=e.se.fi,y=e.se.se;
        x=find(x),y=find(y);
        if(x!=y)fa[x]=y,res+=z;
    }
    cout<<res;
}

到了这里,关于【学习笔记】CODE FESTIVAL 2017 Final G. Tree MST的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度学习分割任务——Unet++分割网络代码详细解读(文末附带作者所用code)

    ​ 分成语义分割和实例分割 语义分割:语义分割就是把每个像素都打上标签(这个像素点是人,树,背景等)(语义分割只区分类别,不区分类别中具体单位)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 实例分割:实例分割不光要区别类别,还

    2024年02月04日
    浏览(34)
  • VS Code搭建STM32环境 (学习笔记)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 因为本人是行业新人之前学的是51,现在刚开始学32用不习惯STM32Cude的软件所以上网查了几个资料终于弄出了VS Code编写STM32。有不足之处大佬请指出,万分感谢! 提示:以下是本篇文章正文内容,下面案

    2024年02月03日
    浏览(42)
  • 数据挖掘-FINAL笔记

    2023-06-27 10:25 缺失值填充:data = Imputer(missing_values=‘NaN’, strategy=‘mean’, axis=0) 或fillna 2023-06-27 10:48 散点图:plt.scatter(iris.data[iris.target label,x_index],iris.data[iris.tar get label,y_index],label=iris.target_names[label],c=color) 2023-06-27 10:50 3q:a=abs(X-mean) ; a[i]3*std 2023-06-27 10:57 均值归一;MeanNor

    2024年02月11日
    浏览(30)
  • 蟒蛇书入门学习笔记(1)Python&VS code下载与配置

    去年夏天,笔者拿到Eric Matthes所著的蟒蛇书,一番学习下,为其细致与条理所触动。 一个好的语言基础对于后续学习具有巨大作用 。费曼提到,把新知识、复杂概念解释给完全不懂的人听,是最好的提升知识质量、把知识点融入自己的知识体系的方法。 因此基于对蟒蛇书的

    2024年03月26日
    浏览(28)
  • 【深度学习笔记】深度学习框架

    本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记,视频由网易云课堂与 deeplearning.ai 联合出品,主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习,视频的链接如下: 神经网络和深度学习 - 网易云课堂 也欢迎对神经网

    2024年02月14日
    浏览(28)
  • 【学习笔记】STC校验子格编码 syndrome-trellis code

    参考书:隐写学原理与技术 第11章 校验子格编码 两篇原始论文: Minimizing Embedding Impact in Steganography using Trellis-Coded Quantization Minimizing Additive Distortion in Steganography using Syndrome-Trellis Codes STC toolbox CSDN输入公式 背景: 已有的隐写编码局限性: 矩阵编码和GLSBM在分组上进行优化,

    2024年02月05日
    浏览(29)
  • code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree解决

    在使用npm install之后,出现“code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree”报错 所以出现报错时就猜测有可能是版本过老导致的相关问题。 而事实上,ERESOLVE相关的报错原因大多也确实是npm7与npm6之间的差异所导致的。 当然你也可以选择降版本到npm6来解决。 网上有人的

    2024年02月06日
    浏览(34)
  • npm ERR! code ERESOLVEnpm ERR! ERESOLVE unable to resolve dependency tree

    拉取项目到本地 执行 npm install 报错 遇到这个问题首先确认的就是版本是不是太高了,降一下版本。或者通过yarn命令替代npm install命令安装,同理,启动也可以采用yarn dev 启动代替npm run dev 下面教大家用一个NVM工具,这个工具是用来管理node.js版本的 nvm流程安装 1、卸载node.

    2024年02月13日
    浏览(28)
  • npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree

    当我们拿到一个前端项目的时候,想要把它运行起来,首先是要给它安装依赖,即cd到当前项目根目录下去执行npm install命令,然后有一定几率在终端你会遇到这样的报错: npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree 用我的中式英语翻译一下就是:不能解析依赖

    2023年04月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包