国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【圖論】樹上啟發(fā)式合并

這篇具有很好參考價值的文章主要介紹了【圖論】樹上啟發(fā)式合并。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本篇博客參考:

  • Oi Wiki 樹上啟發(fā)式合并
  • 算法學習筆記(86): 樹上啟發(fā)式合并

基本概念

首先,什么是 啟發(fā)式合并 ?

有人將其稱為“優(yōu)雅的暴力”,啟發(fā)式合并就是在合并兩個部分的時候,將內(nèi)容少的部分合并至內(nèi)容多的部分,減少合并的操作時間

樹上啟發(fā)式合并(dsu on tree) 可以被用來解決樹上的 離線問題(請注意,必須要是離線問題,因為處理問題的順序有講究),特別是可以維護以每個點為根的子樹中的信息

一般來說,對于查詢以每個點為根的子樹中的信息的問題,我們可以用樹形dp來處理,但是如果每個點的信息不止一兩個數(shù)字,而是很龐大的部分(比如說每個點所需要的信息都要多個map來存儲),這樣使用樹形dp的空間復雜度將會非常龐大,而樹上啟發(fā)式合并可以用來解決這樣的問題

代碼實現(xiàn)

舉個例子,比如說我們給出一棵樹,樹上的每個結(jié)點染色,現(xiàn)在我們需要統(tǒng)計以每個結(jié)點為根的子樹中出現(xiàn)多少種顏色

最暴力的方法就是每個結(jié)點跑一次 dfs,用 cnt[] 數(shù)組存儲每個顏色出現(xiàn)的次數(shù),輸出

但是很明顯會T的很慘

樹上啟發(fā)式合并,圖論,圖論,深度優(yōu)先,算法
這樣的樹中,我們首先計算2子樹的信息,然后計算3子樹的信息的時候我們又要把2子樹清空,每計算一個新的子樹都要把之前計算過的信息清空,根本存不下來信息啊

然后我們考慮一下怎么優(yōu)化呢,父結(jié)點的信息和子結(jié)點相關(guān),我們可以用子結(jié)點的信息更新父結(jié)點的信息,也就是,我們在計算1子樹的所有結(jié)點信息時,假如4子樹是234里最后一個被計算的,那我們算完4子樹之后,可以不用清空 cnt 數(shù)組,反正我們計算1子樹的時候還是要遍歷4子樹的,將4子樹的信息全部保留,再加上前面23子樹的信息就可以得到1子樹的信息了

這個4子樹應(yīng)該怎么選擇呢?換句話說,我們保留哪一個子樹的信息不被刪除呢?根據(jù)啟發(fā)式合并的思想,保留最龐大的子樹信息不動,就可以減少重復計算的次數(shù)了

在樹鏈剖分時我們把樹中結(jié)點最多的子樹根結(jié)點叫做重子結(jié)點,也就是說,在樹上啟發(fā)式合并的過程中,我們需要先計算所有輕子結(jié)點的信息(每計算一個輕子結(jié)點之后都要刪除這個結(jié)點對當前答案的影響),最后計算重子結(jié)點的信息(保留重子結(jié)點對當前答案的影響),然后再計算前面的輕子結(jié)點(這一次計算要保留結(jié)點對當前答案的影響)

用兩遍 dfs 實現(xiàn)

下面是一些變量定義:文章來源地址http://www.zghlxwxcb.cn/news/detail-852292.html

  • sz[u] 以 u 為根的子樹的結(jié)點數(shù)量
  • son[u] 結(jié)點 u 的重子結(jié)點
  • col[u] 結(jié)點 u 的顏色
  • L[u] 結(jié)點 u 的 dfs 序
  • R[u] 以 u 為根的子樹中結(jié)點 dfs 序的最大值
  • id[u] L 標號 u 對應(yīng)的結(jié)點編號,有 id[L[u]] == u
  • cnt[u] 顏色 u 的出現(xiàn)次數(shù)
  • totcol 目前出現(xiàn)過的顏色個數(shù)
void dfs1(int u, int fa) // u: 當前結(jié)點  fa: 父結(jié)點
{
	L[u] = ++ totdfn; // 更新u的dfs序
	Node[totdfn] = u; // 更新dfs序的映射
	sz[u] = 1; // 初始化子樹大小為1
	for (int i = 0; i < g[u].size(); i ++ )
	{
		int j = g[u][i]; // 子結(jié)點編號
		if (j == fa) continue;
		dfs1(j, u);
		sz[u] += sz[j]; // 用子結(jié)點的sz更新父結(jié)點的sz
		if (sz[j] > sz[son[u]]) son[u] = j; // 更新重子結(jié)點
	}
	R[u] = totdfn; // 更新當前子樹中dfs序的最大值
}

void dfs2(int u, int fa, bool keep) // u: 當前結(jié)點  fa: 父結(jié)點  keep: 此次遍歷計算的答案是否保留
{
	// 計算輕子結(jié)點的答案
	for (int i = 0; i < g[u].size(); i ++ )
	{
		int j = g[u][i]; // 子結(jié)點編號
		if (j == fa || j == son[u]) continue; // 遇到重子結(jié)點或者父結(jié)點就跳過
		dfs2(j, u, false); // 繼續(xù)計算輕子結(jié)點的答案且不保留
	}

	if (son[u]) dfs2(son[u], u, true); // 計算重兒子答案并保留計算過程中的數(shù)據(jù)(用于繼承)

	for (int i = 0; i < g[u].size(); i ++ )
	{
		int j = g[u][i]; // 子結(jié)點編號
		if (j == fa || j == son[u]) continue; // 遇到重子結(jié)點或者父結(jié)點就跳過

		// 子樹結(jié)點的 DFS 序構(gòu)成一段連續(xù)區(qū)間,可以直接遍歷
		for (int k = L[j]; k <= R[j]; k ++ ) add(id[k]); // 加上輕子結(jié)點對答案的貢獻
	}
	add(u); // 加上當前子樹根結(jié)點對答案的貢獻
	ans[u] = totcol;
	if (keep == false) // 如果當前計算的答案不保留 就刪去
		for (int i = L[u]; i <= R[u]; i ++ ) del(id[i]);
}

到了這里,關(guān)于【圖論】樹上啟發(fā)式合并的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 啟發(fā)式搜索 :A*算法詳解

    A*算法,(A-Star)算法是一種靜態(tài)路網(wǎng)中求解 最短路徑 最有效的 直接搜索方法 ,也是解決許多搜索問題的有效算法。 算法中的距離估算值與實際值 越接近 ,最終搜索速度越快。 對于求兩個點之間的最短路 普通的BFS是按層遍歷的過程,以起點為中心,以到終點的最短路為半徑

    2023年04月08日
    瀏覽(22)
  • 【啟發(fā)式算法】灰狼優(yōu)化算法【附python實現(xiàn)代碼】

    【啟發(fā)式算法】灰狼優(yōu)化算法【附python實現(xiàn)代碼】

    寫在前面: 首先感謝兄弟們的訂閱,讓我有創(chuàng)作的動力,在創(chuàng)作過程我會盡最大能力,保證作品的質(zhì)量,如果有問題,可以私信我,讓我們攜手共進,共創(chuàng)輝煌。 路雖遠,行則將至;事雖難,做則必成。只要有愚公移山的志氣、滴水穿石的毅力,腳踏實地,埋頭苦干,積跬

    2024年02月16日
    瀏覽(25)
  • 非梯度類啟發(fā)式搜索算法:Nelder Mead

    非梯度類啟發(fā)式搜索算法:Nelder Mead

    Hello,今天給大家介紹一種不基于梯度的優(yōu)化算法 Nelder Mead。 Nelder Mead?算法通常是用來求解非線性(nonlinear)、導函數(shù)未知情況下目標函數(shù)的最大值或者最小值。學過梯度下降的同學應(yīng)該知道,梯度下降類算法的每一步都需要計算當前位置的梯度,從而更新當前解使得最終逐

    2024年02月02日
    瀏覽(23)
  • 元啟發(fā)式算法庫 MEALPY 初體驗-遺傳算法為例

    元啟發(fā)式算法庫 MEALPY 初體驗-遺傳算法為例

    官網(wǎng): MealPY官網(wǎng) 開源許可: (GPL) V3 MEALPY (MEta-heuristic ALgorithms in PYthon) 是一個提供最新自然啟發(fā)式元啟發(fā)算法的Python模塊,它是最大的此類Python模塊之一。這些算法模仿自然界中的成功過程,包括生物系統(tǒng)以及物理和化學過程。mealPy 的目標是免費向所有人分享元啟發(fā)領(lǐng)域的知識

    2024年04月11日
    瀏覽(22)
  • 啟發(fā)式搜索算法:A算法(全局、局部擇優(yōu)算法)+A*算法 解決八數(shù)碼問題

    啟發(fā)式搜索算法:A算法(全局、局部擇優(yōu)算法)+A*算法 解決八數(shù)碼問題

    參考博客:人工智能搜索策略:A*算法 在圖搜索算法中,如果能在搜索的每一步都利用估價函數(shù)f(n)=g(n)+h(n)對Open表中的節(jié)點進行排序,則該搜索算法為 A算法 。由于估價函數(shù)中帶有問題自身的啟發(fā)性信息,因此,A算法又稱為啟發(fā)式搜索算法。 對啟發(fā)式搜索算法,又可根據(jù)搜

    2024年02月10日
    瀏覽(26)
  • 人工大猩猩部隊優(yōu)化器:一種新的面向全局優(yōu)化問題的自然啟發(fā)元啟發(fā)式算法(Matlab代碼實現(xiàn))

    人工大猩猩部隊優(yōu)化器:一種新的面向全局優(yōu)化問題的自然啟發(fā)元啟發(fā)式算法(Matlab代碼實現(xiàn))

    ???????目錄 ??1 概述 ??2 運行結(jié)果 ??3 參考文獻 ?????4 Matlab代碼 元啟發(fā)式在解決優(yōu)化問題方面發(fā)揮著關(guān)鍵作用,其中大多數(shù)都受到自然界中自然生物集體智慧的啟發(fā)。本文提出了一種新的元啟發(fā)式算法,其靈感來自自然界大猩猩部隊的社會智能,稱為人工大猩猩部

    2024年02月01日
    瀏覽(25)
  • 數(shù)學啟發(fā)式

    優(yōu)化求解器 | Gurobi 數(shù)學啟發(fā)式算法:參數(shù)類型與案例實現(xiàn) 數(shù)學啟發(fā)式算法 | 可行性泵 (Feasibility Pump)算法精講:一份讓您滿意的【理論介紹+編程實現(xiàn)+數(shù)值實驗】學習筆記(Python+Gurobi實現(xiàn)) 大佬到底是大佬!這些資料太適合我這種沒基礎(chǔ)的人了! 數(shù)學啟發(fā)式(Mathematical Heurist

    2024年02月04日
    瀏覽(21)
  • 【論文閱讀】聚集多個啟發(fā)式信號作為監(jiān)督用于無監(jiān)督作文自動評分

    【論文閱讀】聚集多個啟發(fā)式信號作為監(jiān)督用于無監(jiān)督作文自動評分

    本文提出一個新的無監(jiān)督的AES方法ULRA,它不需要真實的作文分數(shù)標簽進行訓練; ULRA的核心思想是使用多個啟發(fā)式的質(zhì)量信號作為偽標準答案,然后通過學習這些質(zhì)量信號的聚合來訓練神經(jīng)自動評分模型。 為了將這些不一致的質(zhì)量信號聚合為一個統(tǒng)一的監(jiān)督信號,我們將自動

    2024年02月16日
    瀏覽(28)
  • 如何進行測試分析與設(shè)計-HTSM啟發(fā)式測試策略模型 | 京東云技術(shù)團隊

    如何進行測試分析與設(shè)計-HTSM啟發(fā)式測試策略模型 | 京東云技術(shù)團隊

    測試,沒有分析與設(shè)計就失去了靈魂; 測試人員在編寫用例之前,該如何進行測試分析與設(shè)計呢?上次在《測試的底層邏輯》中講到了【輸入輸出測試模型】,還講到了【2W+1H測試分析法】,但2W1H分析法是初步的分析方法,具體在測試中如何落地,還需要更細的設(shè)計。 今天

    2024年02月05日
    瀏覽(23)
  • Codeforces Round 890 (Div. 2) D. More Wrong(交互題 貪心/啟發(fā)式 補寫法)

    Codeforces Round 890 (Div. 2) D. More Wrong(交互題 貪心/啟發(fā)式 補寫法)

    題目 t(t=100)組樣例,長為n(n=2000)的序列 交互題,每次你可以詢問一個區(qū)間[l,r]的逆序?qū)?shù),代價是 要在的代價內(nèi)問出最大元素的位置,輸出其位置 思路來源 neal Codeforces Round 890 (Div. 2) supported by Constructor Institute D (交互+分治) 附加強 - 知乎 題解 賽中開題順序大失敗沒看這個

    2024年02月14日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包