poj1655树的重心
2013-08-10 16:57
281 查看
给定一棵树,找出一个点X,使得删去X后,剩下的最大的子树最小。
解法:
从上图知,删去点i后,形成的森林为点i的若干子树与i‘上方’的部分。
S[i]表示以i为根的子树的大小
S[i] = ∑S[j] + 1 {j是i的儿子}
S[i] = 1 {j是叶子结点}
考虑每个节点i,剩下的最大子树的大小MaxSize(i) = Max{S[j], N-S[i]},故计算出所有的MaxSize(i)后取最优即可。
复杂度分析:
虽然每个点可能有很多儿子,但每条边只会更新一次,而一共只有n-1条边,故时间复杂度为O(N)。
解法:
从上图知,删去点i后,形成的森林为点i的若干子树与i‘上方’的部分。
S[i]表示以i为根的子树的大小
S[i] = ∑S[j] + 1 {j是i的儿子}
S[i] = 1 {j是叶子结点}
考虑每个节点i,剩下的最大子树的大小MaxSize(i) = Max{S[j], N-S[i]},故计算出所有的MaxSize(i)后取最优即可。
复杂度分析:
虽然每个点可能有很多儿子,但每条边只会更新一次,而一共只有n-1条边,故时间复杂度为O(N)。
#include<stdio.h> #include<string.h> #include<string> #include<algorithm> #include<iostream> #include<set> #include<map> #include<queue> #include<stack> #include<vector> #include<math.h> #include<stdlib.h> using namespace std; #define M 200005 int head[M],tot,mark[M],n; struct node { int to,next; }nd[M];//双向边,要开大点 int ndnum,balance; void add(int x,int y) { nd[tot].to=y;nd[tot].next=head[x];head[x]=tot++; } int dfs(int w) { int i,j,k; int sum=1,mx=0; mark[w]=1; for(i=head[w];i!=-1;i=nd[i].next) { if(mark[nd[i].to]==1) continue; k=dfs(nd[i].to); sum+=k; mx=max(mx,k); } mx=max(mx,n-sum); if(mx<balance||mx==balance&&w<ndnum) { ndnum=w; balance=mx; } return sum; } int main() { int cas,i,j,k,u,v; scanf("%d",&cas); while(cas--) { memset(head,-1,sizeof(head)); memset(mark,0,sizeof(mark)); tot=0; scanf("%d",&n); for(i=1;i<n;i++) { scanf("%d%d",&v,&u); add(v,u); add(u,v); } balance=ndnum=M; dfs(1); printf("%d %d\n",ndnum,balance); } return 0; }
相关文章推荐
- POJ 1655 Balancing Act (树的重心)
- (树的重心) poj 1655
- POJ 1655 Balancing Act (树的重心 + DFS)
- poj 1655 Balancing Act(树的重心)
- POJ1655 Balancing Act——树的重心,Dfs
- poj1655—Balancing Act(树的重心)
- poj 1655Balancing Act(找重心,树形dp)
- POJ 1655 Balancing Act 树型DP 树的重心 板题
- 【POJ - 1655】Balancing Act 【树形DP 求解树的重心】
- poj 1655 Balancing Act 【树的重心】
- POJ 1655 Balancing Act&&POJ 3107 Godfather(树的重心)
- poj 1655 Balancing Act 求树的重心
- poj 1655 Balancing Act 求树的重心(详解树重心求法)
- POJ 1655 Balancing Act【树的重心】
- POJ 1655 Balancing Act (树形dp 树的重心)
- POJ 1655(求树的重心)
- 【树的重心】 POJ 1655 Balancing Act
- POJ 1655 Balancing Act (树的重心)
- POJ 1655 Balancing Act( 树的重心 )
- poj 1655 求树的重心