題目:
題意:給定一棵樹,求樹的重心的編號以及重心刪除後得到的最大子樹的節點個數size,如果size相同就選取編號最小的.
分析:首先要知道什麼是樹的重心,樹的重心定義為:找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵
樹的重心,刪去重
心後,生成的多棵樹盡可能平衡.
樣例:
輸入:
輸出:1 217
2 61 2
1 44 5
3 73 1
#include//poj不認萬能標頭檔案
//#include//#include//#include//#include//#include//#include//#include#define mmp memset
using namespace std;
const int n = 20005;
const int inf = 1<<30;//1*2^30
int head[n],son[n],cnt,n,ans,size;
bool vis[n];
struct edgeedge[2*n];
void init()
void add(int u,int v)
void dfs(int cur){//搜尋
vis[cur] = 1;//已經遍歷過
son[cur] = 0;
int tmp = 0;
for(int i=head[cur];i>=0;i=edge[i].next){//遍歷邊
// cout<
poj1655樹的重心
給定一棵樹,找出乙個點x,使得刪去x後,剩下的最大的子樹最小。解法 從上圖知,刪去點i後,形成的森林為點i的若干子樹與i 上方 的部分。s i 表示以i為根的子樹的大小 s i s j 1 s i 1 考慮每個節點i,剩下的最大子樹的大小maxsize i max,故計算出所有的maxsize i ...
poj 1655 樹的重心
題意 給了乙個樹,去掉乙個結點後的子樹的節點數的最大值即平衡值,求最小的平衡值,如果平衡值相同,使節點號最小。思路 其實也就是求樹的重心。樹的重心是找到乙個點使其所有子樹中節點個數最大的子樹的結點數目最小,使生成的樹盡可能平衡。其實 求樹的重心,只需要隨便找個點作為根dfs,求每個節點的每個子樹的節...
poj 1655 樹的重心
因為建立的樹實際上主要是記錄點的無向圖g,dfs u,r 的r是用來防止遍歷子節點時dfs到父節點,還用到了記憶化,並且是在一次dfs時求答案,效率有點低,ac用時300ms include include include include include include include includ...