時間限制: 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行,每行乙個整數,表示重心。按從小到大的順序給出。
71 21 3
2 42 5
3 63 7
11
#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...