POJ 1655 - DP 树的重心,经典 #P
2013-06-16 09:40
387 查看
POJ 1655 - DP 树的重心,经典 #P
题意:求树的重心。
树的重心:删去重心后,生成的多棵树尽可能平衡。
重心的意义,在对树进行分治的时候可以避免N^2的极端复杂度(从退化链的一端出发),保证NlogN的复杂度。
解法:
一开始想到的是模仿求树的直径那样子去Dp,两次DFS。
son[i] - 结点i的儿子结点数目
第一遍求出son;
h[i] - 结点i向上的结点数目
h[i] = h[k] + son[k] - son[i] - 1;
blance = max(son[j] , h[i])
第二遍求出h,和blance;
后来去看题解,才发现有更简单的方法。
应用一个性质,h[i] = n - son[i] -1;
blance = max(son[j] , n - son[i] -1);
这样只需要一次DFS。
题意:求树的重心。
树的重心:删去重心后,生成的多棵树尽可能平衡。
重心的意义,在对树进行分治的时候可以避免N^2的极端复杂度(从退化链的一端出发),保证NlogN的复杂度。
解法:
一开始想到的是模仿求树的直径那样子去Dp,两次DFS。
son[i] - 结点i的儿子结点数目
第一遍求出son;
h[i] - 结点i向上的结点数目
h[i] = h[k] + son[k] - son[i] - 1;
blance = max(son[j] , h[i])
第二遍求出h,和blance;
后来去看题解,才发现有更简单的方法。
应用一个性质,h[i] = n - son[i] -1;
blance = max(son[j] , n - son[i] -1);
这样只需要一次DFS。
#include <cstdio> #include <iostream> #include <fstream> #include <cstring> #include <string> #include <vector> #define OP(s) cout<<#s<<"="<<s<<" "; #define PP(s) cout<<#s<<"="<<s<<endl; using namespace std; int n; vector <int> adj[20010]; int son[20010]; bool vd[20010]; int ans,asize = 1<<29; void DFS(int s) { vd[s] = 1; son[s] = 0; int blance = 0; int size = adj[s].size(); for (int j = 0;j < size;j++) { int u = adj[s][j]; if (vd[u]) continue; DFS(u); son[s] += son[u]+1; blance = max(blance,son[u]+1); } blance = max(blance,n - son[s] - 1); if (blance < asize || blance == asize && s < ans) ans = s,asize = blance; } int main() { // freopen("test.txt","r",stdin); int T; cin>>T; while(T--) { cin>>n; for (int i = 1;i <= n;i++) adj[i].clear(); for (int i = 1;i <= n-1;i++) { int u,v; scanf("%d%d",&u,&v); adj[u].push_back(v); adj[v].push_back(u); } memset(vd,0,sizeof(vd)); asize = 1<<29; DFS(1); cout<<ans<<" "<<asize<<endl; } return 0; }
相关文章推荐
- POJ 1655 Balancing Act(求树的重心--树形DP)
- POJ1655-树的重心&树形dp-Balancing Act
- poj 1655 Balancing Act(树的重心,树形dp)
- poj 1655 树形dp求取树的重心
- 【poj 1655,3107】树的重心(树形dp)
- poj-1655 Balancing Act(树的重心+树形dp)
- poj 1655(树形DP 求解重心)
- 【POJ - 1655】Balancing Act 【树形DP 求解树的重心】
- POJ 1655 树的重心(树形 DP)
- poj 1655 and 3107 and 2378 树形dp(树的重心问题)
- poj1655 Balancing Act【树的重心+树形dp】
- poj 1655 Balancing Act 【树形DP 求树的重心】
- poj 1655Balancing Act(找重心,树形dp)
- 求树的重心 POJ 1655、POJ 3107 树形DP
- POJ 1655 Balancing Act (树形dp 树的重心)
- POJ 1655 Balancing Act(求树的重心)
- POJ 1160 Post Office (区间DP+重心)
- poj1655(树的重心)
- 【经典dp】 poj 3671
- POJ 1655 Balancing Act 树的重心