边分治讲解

前言:

  边分治和点分治一样属于树分治的一部分,相比于点分治,边分治对于与度数相关的问题有着很大的优势,同时边分治也是解决树上最优化问题的一种重要的算法。

分治过程:

  边分治的分治过程与点分治类似,同样每次分治时找到一条分治中心边使这条边两端的两个联通块中较大的一个尽量小。以分治中心边为界限,恰好将当前分治的联通块中的点分成了两部分,统计路径经过分治中心边的答案,然后将分治中心边断开,递归分治中心边两端的两个联通块。

代码实现:

找分治中心边

找分治中心边和找树的重心方法类似,同样记录子树大小,对于每条边取这条边的子节点子树大小size及联通块大小-size中较大的一个更新分治中心边。代码中sum为联通块大小。

inline void getroot(int x,int fa,int sum)
{size[x]=1;for(int i=head[x];i;i=next[i]){if(!vis[i>>1]&&to[i]!=fa){getroot(to[i],x,sum);size[x]+=size[to[i]];int mx_size=max(size[to[i]],sum-size[to[i]]);if(mx_size<num){num=mx_size;root=i;}}}
}

边分治

因为我们需要知道分治中心边的两端点,所以在开双向边时边的编号要从2开始,这样x与x^1就是一对双向边。代码中的calc函数是统计经过分治中心边的答案。

inline void partation(int x,int sum)
{num=INF;getroot(x,0,sum);if(num==INF){return ;}int now=root;vis[now>>1]=1;cnt=0;dfs2(x,0,to[now],1);dfs2(to[now],0,0,2);calc();int sz=size[to[now]];partation(to[now],sz);partation(x,sum-sz);
}

多叉树转二叉树

边分治的时间复杂度同样是$O(nlogn)$,但会被菊花图卡成$O(n^2)$,所以我们要将多叉树转成二叉树,这样虽然会有一个二倍常数但可以保证时间复杂度是$O(nlogn)$。

多叉树转二叉树的方法有两种:

1、第一种方法是从1开始枚举每个点,对于一个点$x$,如果他有<=2个子节点,那么直接向子节点连边即可;否则新建两个点,将$x$连向这两个点,并将$x$的子节点按奇偶分类暂时归为这两个新建点的子节点。为了不影响原树深度等信息,我们将连向新建点的边权设为0。这样新建树因为每条原树边会被存$logn$次,所以空间复杂度是$O(nlogn)$,新建节点数$O(n)$。代码中m为总点数。

void rebuild()
{tot=1;for(int i=1;i<=n;i++){head[i]=0;}for(int i=1;i<=n;i++){int len=q[i].size();if(len<=2){for(int j=0;j<len;j++){add(i,q[i][j],(q[i][j]<=m));add(q[i][j],i,(q[i][j]<=m));}}else{int ls=++n;int rs=++n;v[ls]=v[rs]=v[i];add(i,ls,0);add(ls,i,0);add(i,rs,0);add(rs,i,0);for(int j=0;j<len;j++){if(j&1){q[ls].push_back(q[i][j]);}else{q[rs].push_back(q[i][j]);}}}}
}

2、第二种方法是dfs整棵树,对于原树每个点x,记录一个$last$(初始为x),每次将$last$连向一个子节点,并新建一个点$y$将$last$连向$y$,然后将$last$改为$y$。同样将连向新建点的边权设为0。因为每个原树边只被保存一次,所以空间复杂度是$O(n)$,新建点数是$O(n)$。代码中m为总点数。

inline void rebuild(int x,int fa)
{int tmp=0;int last=0;int len=v[x].size();for(int i=0;i<len;i++){int to=v[x][i].first;int val=v[x][i].second;if(to==fa){continue;}tmp++;if(tmp==1){add(x,to,val);add(to,x,val);last=x;}else if(tmp==len-(x!=1)){add(last,to,val);add(to,last,val);}else{m++;add(last,m,0);add(m,last,0);last=m;add(m,to,val);add(to,m,val);}}for(int i=0;i<len;i++){if(v[x][i].first==fa){continue;}rebuild(v[x][i].first,x);}
}

边分治的性质:

1、如果我们在边分治找中心时以当前联通块在原树中深度最小的点为根,那么找到的分治中心边在原树中一定是一条从父节点$u$到子节点$v$的边,这条边将当前联通块分成了两部分,可以发现包含$v$的那部分一定是原树中的一棵子树,我们假设包含$u$的部分为$S$,包含$v$的部分为$T$,那么$S$中的任意一个点$x$与$T$中的任意一个点$y$的$lca$一定不在$T$中,这也就说明$x$与$T$中所有点的$lca$都相同,就是$lca(x,v)$。

2、边分治将每次的分治联通块中的点恰好分成了两部分,这就省去了像点分治那样单独处理以分治重心为路径端点的答案这一过程。

边分树:

与点分树类似,我们将每层分治中心边连向下一层的分治中心边所形成的树就是边分树,边分树是一棵二叉树,它可以类似线段树一样合并,这一部分内容暂时还不完整,待博主后续更新。

练习题:

BZOJ2870最长道路(边分治模板题)

CSTC2018暴力写挂(两棵树,第一棵树边分治转到第二棵树上建虚树DP)

WC2018通道(三棵树,码量较大)

转载于:https://www.cnblogs.com/Khada-Jhin/p/10154994.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

准确性 敏感性 特异性_如何掌握类型特异性的艺术

准确性 敏感性 特异性Do more specific definitions result in less flexibility?更具体的定义会导致灵活性降低吗&#xff1f; In this post I will try to avoid the debate about strong/static vs. weak/dynamic types (what more could possibly be said?), or even sc…

Pycharm社区版配置Django

Pycharm开发版(收费)自带Django模板&#xff0c;社区版(免费)需要通过命令行创建Django项目。 通过pip安装Django&#xff1a;pip install django2.0.2(版本号)&#xff0c;可通过以下命令检查是否安装成功 在命令行下创建Django项目(项目存放在D:\PyCharm) 1.创建项目 进入D:\…

家里也是不知不觉就电脑有不能开启了

一如既往的把电脑搬上去&#xff0c;我推测就是因为内存条金手指的接触不好了&#xff0c;然后多次的强制关机让我心疼&#xff0c;还有是花了30元装系统还是有些不服气&#xff0c;最后还是要回去弄好。 转载于:https://www.cnblogs.com/bkchengzheng/p/5662222.html

oracle model 分组,【已解决】关于Oracle分组函数高级用法(按照N条分组并生成唯一号)...

prompt PL/SQL Developer import fileprompt Created on 2018年3月30日 byset feedback offset define offprompt Creating T_TEST_GROUP...create table T_TEST_GROUP(code VARCHAR2(100),supplier VARCHAR2(100),item_id VARCHAR2(100),num NUMBER,lot VARCHA…

用Mesos分布式架构进行工作

引言&#xff1a;2010年&#xff0c;一个旨在解决扩容问题的项目诞生——Apache Mesos&#xff0c;它在某种程度上对CPU、内存、磁盘资源进行抽象&#xff0c;从而允许整个数据中心如同单台大服务器般运转。无需虚拟机和操作系统&#xff0c;Mesos创造了一个单独底层的集群为应…

angular和react_如何在Angular中验证默认和自定义React形式

angular和reactby Luuk GruijsLuuk Gruijs着 如何在Angular中验证默认和自定义React形式 (How to validate default and custom reactive forms in Angular) When presenting forms to your users, it’s considered very user-friendly to give them immediate feedback on w…

POJ 1502 MPI Maelstrom 最短路

最短路模板。 题意&#xff1a;从‘1’点发出一个信号到各个点&#xff0c;不同的点可以同时发出一个信号但到达目标的时间不同&#xff0c;问所有点接受到信号所耗费的最短时间为多少。 思路&#xff1a;迪杰斯特拉求出1点到各个点的最短路&#xff0c;遍历一遍找到其中的最大…

调试dump文件

调试dump文件 1、设置好pdb文件和源代码路径 为了能正确分析Dump文件&#xff0c;我们必须要指定和程序一起出来的PDB文件&#xff0c;如果程序重新被编译了一次&#xff0c;即使代码没有任何变化&#xff0c;之前的PDB文件我们不能再继续使用。posted on 2018-12-28 17:50 mao…

不一样的视角,程序员世界里的环保

摘要&#xff1a; 我们身边有很多可以做的技术环保工作。比如说&#xff0c;在Linux下少用root用户&#xff0c;SQL的时候&#xff0c;delete前先select&#xff0c;这样&#xff0c;你就不会做出一些让你后悔的事。不会让你重头来过&#xff0c;从而至少不会浪费电能。写代码的…

oracle查出连续5行,Oracle期末考试复习题2

复习题一、填空题&#xff1a;1. Oracle EnterpriseManager是一个基于 B/S的框架系统。2&#xff0e;Oracle数据库的存储结构分为物理结构和逻辑结构。3&#xff0e;在游标或者游标变量打开后还没有进行第一次提取时&#xff0c;&#xff05;found属性为null。4. 在oracle中已c…

selinux会阻碍挂载嘛_为什么追求完美可能会阻碍您成为新手Web开发人员

selinux会阻碍挂载嘛by Rick West由里克韦斯特(Rick West) 为什么追求完美可能会阻碍您成为新手Web开发人员 (Why striving for perfection might be holding you back as a newbie web developer) I am a perfectionist. Or, at least, I like to think I am. Either way, I’…

MySQL优化的一些基础

在Apache, PHP, mysql的体系架构中&#xff0c;MySQL对于性能的影响最大&#xff0c;也是关键的核心部分。对于Discuz!论坛程序也是如此&#xff0c;MySQL的设置是否合理优化&#xff0c;直接 影响到论坛的速度和承载量&#xff01;同时&#xff0c;MySQL也是优化难度最大的一个…

oracle 会话 lock,相克军_Oracle体系_随堂笔记014-锁 latch,lock

1、Oracle锁类型锁的作用latch锁&#xff1a;chain&#xff0c;链LOCK锁排他锁(X)共享锁(S)2、行级锁&#xff1a;DML语句事务锁TX锁的结构事务锁的加锁和解锁过程只有排他锁不影响读(CR块)3、表级锁&#xff1a;TM行级排他锁(Row exclusive)RX锁当我们进行DML时&#xff0c;会…

电线之间:采访Microsoft Edge性能PM Nolan Lawson

by Vivian Cromwell通过维维安克伦威尔(Vivian Cromwell) 电线之间&#xff1a;采访Microsoft Edge性能PM Nolan Lawson (Between the Wires: An interview with Microsoft Edge performance PM Nolan Lawson) I interviewed Nolan Lawson, Web Performance PM at Microsoft E…

swift菜鸟入门视频教程-09-类和结构体

本人自己录制的swift菜鸟入门&#xff0c;欢迎大家拍砖&#xff0c;有什么问题能够在这里留言。主要内容&#xff1a;类和结构体对照 结构体和枚举是值类型 类是引用类型 类和结构体的选择 集合&#xff08;collection&#xff09;类型的赋值与复制行为视频地址&#xff1a;百度…

oracle的集合操作符,[Oracle] Oracle的集合操作符

Oracle的集合操作包括: union , intersect , minus.[例子]假设有两个表a,b如下:SQL> select * from a;COLA----------123SQL> select * from b;COLB----------345union : 得到两个结果集的并集(不含重复值)SQL> select * from a2 union3 select * from b;COLA------…

锁大全与 GDB调试

1.innodb_lock_monitor&#xff1a;打开锁信息的方式 mysql> create table innodb_lock_monitor(id int) engineInnoDB; Query OK, 0 rows affected, 1 warning (2.29 sec) mysql> begin work; Query OK, 0 rows affected (0.00 sec) mysql> update t set val val 1…

[笔试面试题] 8-面向对象篇

面向对象篇 1 面向对象与面向过程的含义以及区别&#xff1f; 面向对象 面向对象是把数据及对数据的操作方法放在一起&#xff0c;作为一个相互依存的整体&#xff0c;即对象。对同类对象抽象出其共性&#xff0c;即类&#xff0c;类中的大多数数据&#xff0c;只能被本类的方法…

管理员所有权代码_为什么代码所有权糟透了,您永远不应该在有实践的地方工作...

管理员所有权代码Code ownership sucks.代码所有权糟透了。 It limits code and stunts your growth as a developer.它限制了代码并阻碍了您作为开发人员的成长。 Let’s look at what code ownership is and why it destroys individuals and organizations.让我们看看什么…

AngularJS 自定义控件

AngularJS Custom Directives 好讨厌不带日期的博客&#xff0c;而且说得好啰嗦 自定义指令介绍 AngularJS 指令作用是在 AngulaJS 应用中操作 Html 渲染。比如说&#xff0c;内插指令 ( {{ }} ), ng-repeat 指令以及 ng-if 指令。 当然你也可以实现自己的。这就是 AngularJS 所…