bzoj2078 求樹的重心

2021-07-30 06:34:11 字數 939 閱讀 7774

時間限制: 1 sec  記憶體限制: 128 mb

樹的重心定義為樹的某個節點,當去掉該節點後,樹的各個連通分量中,節點數最多的連通分量其節點數達到最小值。樹可能存在多個重心。如下圖,當去掉點1後,樹將分成兩個連通塊:(2,4,5),(3,6,7),則最大的連通塊包含節點個數為3。若去掉點2,則樹將分成3個部分,(4),(5),(1,3,6,7)最大的連通塊包含4個節點;第一種方法可以得到更小的最大聯通分量。可以發現,其他方案不可能得到比3更小的值了。所以,點1是樹的重心。

輸入:第一行乙個整數n,表示樹的結點個數。(n<100)

接下來n-1行,每行兩個數i,j。表示i和j有邊相連。

輸出:第一行乙個整數k,表示重心的個數。

接下來k行,每行乙個整數,表示重心。按從小到大的順序給出。

7

1 21 3

2 42 5

3 63 7

1

1

#include#include#includeusing namespace std;

const int max=100;

int n,tot,minnum=0x3f3f3f3f;

int fir[max+5],nxt[(max<<1)],ans[max+5],cnt[max+5],sum[max+5];

int dp[max+5][2],l[(max<<1)];

bool vis[max+5];

int max(int a,int b)

num*=fla;

}void add(int a,int b)

void search(int r,int f)

int main(){

getint(n);

int a,b;

for(int i=1; i

求樹的重心

題目 題意 給定一棵樹,求樹的重心的編號以及重心刪除後得到的最大子樹的節點個數size,如果size相同就選取編號最小的.分析 首先要知道什麼是樹的重心,樹的重心定義為 找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵 樹的重心,刪去重 心後,生成的多棵樹盡可能平衡.實際上樹的重心...

如何求樹的重心

樹的重心 找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹盡可能平衡.打這個blog主要是為了等一下寫的點分治做鋪墊。例題t1 poj1655 題意 求一棵樹上的重心編號和去掉這個重心以後最大子樹的節點數。在dfs上做文章,每次對於乙個點,記錄下他...

求樹的重心 樹的直徑

樹的重心 樹的重心是指樹上一點,去掉後最大子樹可以取得最小值的點。求解方法 樹的重心定義 去掉該點後最大子樹大小不超過n 2。重心為1 樹的直徑指樹上最遠兩點的距離 方法 先隨便找個點,找到離他最遠的點,再在那個最遠的點上找一次最遠的點,這兩個點之間的距離就是直徑。include define ma...