CSP 2019 Day2 T3 樹的重心

2022-06-10 23:24:13 字數 1118 閱讀 8966

題目鏈結

首先有這樣乙個結論

一顆樹的重心要麼是根節點要麼在它重兒子的子樹裡

這個結論十分顯然在這裡就不證明了

於是我們第一遍\(dfs\)求出以1節點為根時每個點的重兒子和次重兒子(因為會斷掉重兒子的這條邊)以及\(pr_\)表示從\(u\)節點開始每次沿重兒子跳\(2^i\)步跳到的點的位置

對於第二次\(dfs\),遍歷到\(u\)節點時,考慮其兒子節點\(v\),計算將\((u,v)\)斷掉後的答案

以\(v\)為根節點的子樹重心,直接用先前處理的\(pr\)倍增跳同時判斷\(size\)即可

而\(u\)為根節點的樹的重心(相當於換根),從1到\(u\)沿途修改重兒子值即可,倍增方法相同

#includeusing namespace std;

const int _=3e5+5;

int t,n,tot;

int fi[_],ne[_<<1],to[_<<1];

int son[_],sc_son[_],h[_][20],sz[_];

long long ans;

inline int read()

inline void add(int x,int y)

inline void pre(int x)

void dfs1(int u,int fa)

else if(sv>sz[sc])sc=v;

} pre(u);

}inline void get_ans(int x)

int y=x;

for(int i=18;i>=0;--i)

if(sz[x]-sz[h[y][i]]sz[s])s=fa;

pre(u);

get_ans(u),get_ans(v);

dfs2(v,u);

su=_su;s=_s;pre(u); }}

int main()

fill(son+1,son+n+1,0);

fill(sc_son+1,sc_son+n+1,0);

dfs1(1,0);dfs2(1,0);

printf("%lld\n",ans);

} return 0;

}

CSP S2019 D2T3 樹的重心

小簡單正在學習離散數學,今天的內容是圖論基礎,在課上他做了如下兩條筆記 乙個大小為 n nn 的樹由 n nn 個結點與 n 1 n 1 n 1 條無向邊構成,且滿足任意兩個結點間有且僅有一條簡單路徑。在樹中刪去乙個結點及與它關聯的邊,樹將 為若干個子樹 而在樹中刪去一條邊 保留關聯結點,下同 樹將...

CSP2019樹的重心

題解 csp2019d2t3 首先我們要明確乙個性質,那就是對於一棵樹的任何乙個節點來說,如果這個點不是重心,那麼這棵樹的重心就一定在這個節點的以重兒子為根節點的子樹裡 證明顯而易見,因為該點不是重心所以siz 重兒子 一定大於 lfloor frac rfloor 另外還有乙個重心的定義 重心所有...

CSP2019 樹的重心

點這裡看題目。原來資料的奇怪結尾就可以拿來判斷特徵呀 太簡單就不說了。考慮完全二叉樹怎麼做。這裡需要注意一點,就是 n 262143 2 1 也就是說,資料實際上就是一棵滿二叉樹。由於滿二叉樹具有極強的對稱性,我們不難想到這樣解決 首先,答案一定包含 frac rt 其中 rt 是樹的根。考慮根的左...