樹鏈剖分模板

2022-05-05 00:45:13 字數 961 閱讀 8602

樹鏈剖分的目的:1.維護樹/路徑上的資訊

2.將樹剖分成若干條鏈,用資料結構去維護鏈上的資訊,複雜度為o(logn)

過程:2次bfs

第一次bfs找出所有節點的重兒子(子節點數最多的兒子),並更新相關資訊

第二次bfs將所有的重兒子連成鏈,賦予新的標記,並記錄對應的原標記

圖中紅色的鏈即為一條重邊(重兒子連成的鏈)

int dep[max];//節點的深度

int fa[max];//節點的父親節點

int siz[max];//節點的兒子個數(子節點個數)

int son[max];//節點的重兒子

int top[max];//這條鏈的頂端節點

int tid[max];//按照鏈順序的新編號

int rank1[max];//新編號對應的原編號

模板如下:

1

//樹鏈剖分模板2//

dfs1

3int dep[max];//

節點的深度

4int fa[max];//

節點的父親節點

5int siz[max];//

節點的兒子個數(子節點個數)

6int son[max];//

節點的重兒子7//

dfs2

8int top[max];//

這條鏈的頂端節點

9int tid[max];//

按照鏈順序的新編號

10int rank1[max];//

新編號對應的原編號

1112

void dfs1(int u,int father,int d)//

分出重兒子

1328}29

}30}31

32void dfs2(int u,int tp)//

連點成鏈

3346

}47 }

樹鏈剖分 模板

class match node a n struct no no aa n 4 void init void addpage int x,int y void dfs int s,int faa,int h 根節點,父節點和深度的 if max 0 son s sign void dfs2 int...

模板 樹鏈剖分

define maxn 50010 define l u u 1 define r u u 1 1 寫在類裡面爆棧 int n,m,q int tim 時間戳 int num maxn 樹上每個節點的初始值 int siz maxn siz u 表示以u為根的子樹的節點數 int top maxn ...

樹鏈剖分模板

點權模板 1 m a b c將節點a到節點b路徑上所有點都染成顏色c 2 q a b詢問節點a到節點b路徑上的顏色段數量 連續相同顏色被認為是同一段 如 112221 由3段組成 11 222 和 1 const int n 100100 struct edge g n 2 int cnt,head...