前言:
每個子樹的重心(p)的定義:刪去該點p後,以x為根的子樹的所有聯通塊的大小均不超過 siz[x] / 2
根據這個重心的定義可以知道一棵子樹的重心必定在他自己所在的重鏈中. 所以每次找到他的重兒子為根的子樹的重心, 不符合的話就沿著重鏈往上走直至找到復合要求的重心.
模版題:
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define inf 0x3f3f3f3f
#define ls nod<<1
#define rs (nod<<1)+1
const
double eps = 1e-10
;const
int maxn = 3e5 + 10
;const ll mod = 1e9 + 7
;int sgn(double a)
using
namespace
std;
struct
edge e[maxn];
inthead[maxn],mx[maxn],ans[maxn];
intsiz[maxn],fa[maxn];
intcnt;
void add_edge(int u,int
v) void dfs(int
x) }
int p =ans[mx[x]];
while (p && p !=fa[x])
p =fa[p];
}}int
main()
dfs(1);
while (q--)
return0;
}
求樹的重心
題目 題意 給定一棵樹,求樹的重心的編號以及重心刪除後得到的最大子樹的節點個數size,如果size相同就選取編號最小的.分析 首先要知道什麼是樹的重心,樹的重心定義為 找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵 樹的重心,刪去重 心後,生成的多棵樹盡可能平衡.實際上樹的重心...
如何求樹的重心
樹的重心 找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹盡可能平衡.打這個blog主要是為了等一下寫的點分治做鋪墊。例題t1 poj1655 題意 求一棵樹上的重心編號和去掉這個重心以後最大子樹的節點數。在dfs上做文章,每次對於乙個點,記錄下他...
求樹的重心 樹的直徑
樹的重心 樹的重心是指樹上一點,去掉後最大子樹可以取得最小值的點。求解方法 樹的重心定義 去掉該點後最大子樹大小不超過n 2。重心為1 樹的直徑指樹上最遠兩點的距離 方法 先隨便找個點,找到離他最遠的點,再在那個最遠的點上找一次最遠的點,這兩個點之間的距離就是直徑。include define ma...