balancing act
定義乙個點的「平衡」值等於將這個點拆去後,形成的子樹中節點數的最大值。求一棵樹「平衡」值最小的點。
這其實就是樹的重心的概念,通過樹形 dp 很容易解決。當去掉抹一點後,它下面的子樹的節點個數通過 dfs 可以得到,它上面的子樹的節點個數等於總節點個數減去它本身及其子節點的總節點數。
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
const int max = 20005;
vectorg[max];
int root,mx;
int n;
void init(int n)
root = 0;
mx = int_max;
}int dfs(int u, int fa)
dfs(1,0);
cout << root << ' ' << mx << endl;
}return 0;
}
poj1655 樹的重心 樹形dp
樹的重心定義為 找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹盡可能平衡.處理處每個節點的孩子有幾個,和樹的大小就好了。include include include include include define inf 99999999 usi...
POJ 1655 求樹的重心 樹形dp
題目鏈結 樹的重心 若樹上的乙個節點滿足其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心。1.任選乙個點為根,只要統計出每個點的子樹大小,就能很快求出每個點子樹節點的數量的最大值。2.求每個點子樹的大小同樣只需要自底向上的更新資訊。3.記sz u 為子樹u節點的數量 包括 u 本身 4...
poj1655樹的重心
給定一棵樹,找出乙個點x,使得刪去x後,剩下的最大的子樹最小。解法 從上圖知,刪去點i後,形成的森林為點i的若干子樹與i 上方 的部分。s i 表示以i為根的子樹的大小 s i s j 1 s i 1 考慮每個節點i,剩下的最大子樹的大小maxsize i max,故計算出所有的maxsize i ...