樹鏈剖分的目的: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...