樹的重心 poj3701 模板題

2021-09-25 16:34:17 字數 1101 閱讀 4561

樹的重心也叫樹的質心。找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹盡可能平衡。

思路:dfs深搜+回溯

poj3701  (有多個重心)

ac**:

#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

const int mod=1e9+7;

const int inf=0x3f3f3f3f;

const ll inff=0x3f3f3f3f3f3f3f3f;

const ll max_n=10005;

const ll max_m=100005;

#define mef(x) memset(x,-1,sizeof(x))

#define me0(x) memset(x,0,sizeof(x))

#define mei(x) memset(x,inf,sizeof(x))

struct edge

edge[100005];

int first[50005],cnt=0;

void init()

void add(int u,int v)

int num[50005],al[50005],l,n,mint;//num[i]表示i為根,子樹節點數的個數

//tamp 子樹節點個數的最大值,mint tamp的最小值

void dfs(int u,int fa)

dfs(lv,u);

num[u]+=num[lv];

if(tamptamp)

else if(tamp==mint)

return ;

}int main()

mint=inf;

l=0;

me0(num);

dfs(1,-1);

sort(al,al+l);

for(int i=0;iprintf("\n");

return 0;

}

模板 樹的重心

模板 求樹的重心 任務 求樹的重心 介面 vector way maxn 無向圖 int siz 該節點的子節點個數 包括自己 int mu 該節點的 最大,節點數最多 子樹的節點數 allnode 根節點的子節點個數 siz root int getroot int u,int fa 返回以u為根...

模板 樹的重心

定義 找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹盡可能平衡。首先,利用前向星存邊建立邊表。由於無向,所以要連兩次邊。我們用一次 df s dfs 建立以1為根節點時每個結點所在子樹的結點數。接下來考慮把這個點刪掉的結果,如果乙個非根結點有 p...

樹的重心 模板

刪除重心後,子樹的最大權值最小 dfs遍歷每個點,node的所有子樹除了它的兒子們還有它往父親那個方向的一顆子樹 權值 總權值 所有子樹權值和 1 下面的 權值為邊權 include using namespace std const int maxn 1e5 100,inf 0x3f3f3f3f ...