樹鏈剖分的基本思想

2022-05-14 16:15:15 字數 667 閱讀 2320

一、樹鏈剖分的作用

通常是求樹上u到v的路徑節點之和

這個問題很容易可以想到設f[i]表示根節點到i節點的節點之和

t=lca(u,v),然後可以把u->v劃分為u->t+t->v-t;

則有結論:u->v=f[u]+f[v]-2*f[t]+t,這樣就可以求出來了

但是加上u到v的路徑上的節點值的修改的話,就必須用樹鏈剖分了。。。

二、幾個概念:

1.重兒子:乙個節點的所有兒子中子樹最大的那乙個(相同任意取乙個)

2.輕兒子:除了重兒子以外的所有其他兒子

3.重邊:father連向重兒子的邊

4.輕邊:除了重邊以外的邊

5.重鏈:一條路徑,上面全部都是由重兒子構成(即全為重邊)

三、幾個推論:

1.兩條重鏈之間必然有一些輕邊連線

2.我們用一條重鏈的起始節點來表示一條重鏈(每個節點只會屬於一條重鏈)

3.bel[x]表示x節點的重鏈的開頭節點

四、問題的解決:

首先對於修改操作,將lca(u,v)求出,然後判斷bel[x]是否等於bel[y]

1.如果等於,那就可以直接對一條重鏈上的節點進行修改

2.如果不等於,那就把x和y同時跳到他們的重鏈的頂端,然後跨越輕邊,繼續剛才的過程

其實上面的區間修改和區間查詢可以用線段樹來實現

樹鏈剖分基本步驟

總體步驟 init dfs1 1 dfs2 1,1 build 1,1,n cl dfs1 處理出size sj 子節點數 son sj 重兒子 dep sj 深度 vi sj 點權,把邊權放在子節點上 dfs2 處理出top sj 所在鏈的鏈首,輕兒子從子節點重新開始,重兒子從父節點繼承 id s...

樹鏈剖分 樹鏈剖分講解

好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...

演算法入門 樹鏈剖分 輕重鏈剖分

目錄 3.0 求 lca 4.0 利用資料結構維護資訊 5.0 例題 參考資料 資料結構入門 線段樹 發表於 2019 11 28 20 39 dfkuaid 摘要 線段樹的基本 建樹 區間查詢 單點修改 及高階操作 區間修改 單點查詢 區間修改 區間查詢 標記下傳 標記永久化 閱讀全文 樹鏈剖分用...