POJ 1655 Balancing Act(求树的重心--树形DP)
2015-03-15 09:19
357 查看
题意:求树的重心的编号以及重心删除后得到的最大子树的节点个数size,如果size相同就选取编号最小的.
思路:随便选一个点把无根图转化成有根图,dfs一遍即可dp出答案
思路:随便选一个点把无根图转化成有根图,dfs一遍即可dp出答案
//1348K 125MS C++ 1127B #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<vector> using namespace std; int n; const int N= 20020; struct Edge { int v; Edge(int _v=0) : v(_v) {}; }; vector<Edge>es ; int sumson ; int ans,cur; void dfs(int u,int pa) { int tmp=-1; for(int i=0;i<es[u].size();i++) { int v=es[u][i].v; if(v==pa) continue; dfs(v,u); sumson[u]+=(sumson[v]+1); tmp=max(tmp,sumson[v]+1); } tmp=max(tmp,n-sumson[u]-1); if(tmp<ans||(tmp==ans&&u<cur)) { ans=tmp; cur=u; } } void ini() { for(int i=1;i<=n;i++) es[i].clear(); memset(sumson,0,sizeof(sumson)); ans=0x3f3f3f3f; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d",&n); ini(); int u,v; for(int i=1;i<n;i++) { scanf("%d%d",&u,&v); es[u].push_back(Edge(v)); es[v].push_back(Edge(u)); } dfs(1,0); printf("%d %d\n",cur,ans); } return 0; }
相关文章推荐
- poj 1655 Balancing Act(树的重心,树形dp)
- poj 1655 Balancing Act 【树形DP 求树的重心】
- poj-1655 Balancing Act(树的重心+树形dp)
- POJ 1655 Balancing Act (树形dp 树的重心)
- 【POJ - 1655】Balancing Act 【树形DP 求解树的重心】
- poj1655 Balancing Act【树的重心+树形dp】
- poj 1655Balancing Act(找重心,树形dp)
- POJ 1655 Balancing Act 树形DP入门题
- POJ--1655--Balancing Act--简单树形DP
- poj1655 Balancing Act(树形dp)
- POJ 1655 Balancing Act【树形DP】POJ 1655 Balancing Act Balancing Act POJ 1655
- poj 1655 Balancing Act(树形DP,删点)
- POJ 1655 Balancing Act 树形dp
- poj 1655 Balancing Act(树形DP)
- POJ 1655 Balancing Act 树形DP入门题
- 【dp每一天】POJ - 1655 Balancing Act(说是树形dp其实就是模拟?)
- POJ 1655 Balancing Act(树形DP)
- poj 1655 Balancing Act(树形dp)
- POJ 1655 - Balancing Act 树形DP
- poj1655 Balancing Act 【树形DP(很弱)】