邊分治講解

前言:

  邊分治和點分治一樣屬于樹分治的一部分,相比于點分治,邊分治對于與度數相關的問題有著很大的優勢,同時邊分治也是解決樹上最優化問題的一種重要的算法。

分治過程:

  邊分治的分治過程與點分治類似,同樣每次分治時找到一條分治中心邊使這條邊兩端的兩個聯通塊中較大的一個盡量小。以分治中心邊為界限,恰好將當前分治的聯通塊中的點分成了兩部分,統計路徑經過分治中心邊的答案,然后將分治中心邊斷開,遞歸分治中心邊兩端的兩個聯通塊。

代碼實現:

找分治中心邊

找分治中心邊和找樹的重心方法類似,同樣記錄子樹大小,對于每條邊取這條邊的子節點子樹大小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.pswp.cn/news/395595.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395595.shtml
英文地址,請注明出處:http://en.pswp.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 所…