題目鏈結
首先有這樣乙個結論
一顆樹的重心要麼是根節點要麼在它重兒子的子樹裡
這個結論十分顯然在這裡就不證明了
於是我們第一遍\(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 是樹的根。考慮根的左...