POJ 1655 树的重心(树形 DP)
2017-09-30 15:10
447 查看
题目
Balancing Act题意
定义一个点的“平衡”值等于将这个点拆去后,形成的子树中节点数的最大值。求一棵树“平衡”值最小的点。题解
这其实就是树的重心的概念,通过树形 dp 很容易解决。当去掉抹一点后,它下面的子树的节点个数通过 dfs 可以得到,它上面的子树的节点个数等于总节点个数减去它本身及其子节点的总节点数。代码
#include <algorithm> #include <bitset> #include <cstring> #include <cstdio> #include <cmath> #include <cstdlib> #include <climits> #include <iostream> #include <list> #include <map> #include <queue> #include <set> #include <stack> #include <string> #include <vector> using namespace std; const int MAX = 20005; vector<int>G[MAX]; int root,mx; int n; void init(int n) { for (int i = 1; i <= n; ++i) { G[i].clear(); } root = 0; mx = INT_MAX; } int dfs(int u, int fa) { int len = G[u].size(); int sum = 1; int mx1 = 0; for(int i=0;i<len;++i){ int v = G[u][i]; if(v != fa){ int temp = dfs(v,u); mx1= max(mx1, temp); sum += temp; } } mx1 = max(mx1, (n - sum)); if(mx1 < mx){ root = u; mx = mx1; } else if(mx1 == mx && u < root){ root = u; } return sum; } int main(){ int t; cin >> t; while(t--){ cin >> n; init(n); int u,v; for (int i = 0; i < n - 1; ++i) { scanf("%d %d",&u,&v); G[u].push_back(v); G[v].push_back(u); } dfs(1,0); cout << root << ' ' << mx << endl; } return 0; }
相关文章推荐
- poj1655 Balancing Act【树的重心+树形dp】
- 求树的重心 POJ 1655、POJ 3107 树形DP
- poj 1655 Balancing Act 【树形DP 求树的重心】
- poj 1655Balancing Act(找重心,树形dp)
- POJ1655-树的重心&树形dp-Balancing Act
- POJ 1655 Balancing Act(求树的重心--树形DP)
- POJ 1655 Balancing Act (树形dp 树的重心)
- poj 1655 and 3107 and 2378 树形dp(树的重心问题)
- poj 1655(树形DP 求解重心)
- 【poj 1655,3107】树的重心(树形dp)
- poj 1655 Balancing Act(树的重心,树形dp)
- 【POJ - 1655】Balancing Act 【树形DP 求解树的重心】
- poj 1655 树形dp求取树的重心
- poj-1655 Balancing Act(树的重心+树形dp)
- 简单树形dp-poj-1655-Balancing Act
- POJ 1655 Balancing Act 树形dp
- poj 1655 树形dp
- poj 1655 Balancing Act(树形DP)
- poj 3107 Godfather 求树的所有重心 树形DP
- poj 1655 Balancing Act(树形dp)