标签:
重心的定义是:
找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡
把一个树添加或删除一个叶子,那么它的重心最多只移动一条边的距离。
练习一: POJ1655
题意:求删除这个点后最大子树的节点数,以及这个点的编号,如果有多个点满足,求编号最小的点。
代码如下:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 20010*2; struct nod{ int to,next; }edge[maxn]; int son[maxn],head[maxn],ip,n; int ans,num; bool vis[maxn]; void init(){ num=maxn*maxn; ip=0; memset(vis,0,sizeof(vis)); memset(head,-1,sizeof(head)); } void add(int u,int v){ edge[ip].to=v; edge[ip].next=head[u]; head[u]=ip++; } void dfs(int u){ vis[u]=1; son[u]=0; int maxson=0; for(int i=head[u];i!=-1;i=edge[i].next){ int v = edge[i].to; if(!vis[v]){ dfs(v); son[u]+=son[v]+1; maxson=max(maxson,son[v]+1); } } maxson=max(maxson,n-son[u]-1); if(maxson<num||maxson==num&&u<ans){ ans=u; num=maxson; } } int main() { int t; scanf("%d",&t); while(t--){ scanf("%d",&n); init(); for(int i=0;i<n-1;i++){ int u,v; scanf("%d%d",&u,&v); add(u,v); add(v,u); } dfs(1); printf("%d %d\n",ans,num); } return 0; }
题意:求一棵树的所有重心并从小到大输出
代码如下:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 1e5+10; struct nod { int to,next; } edge[maxn]; int head[maxn],ans[50000]; int n,num,ip,maxsize; int son[maxn]; bool vis[maxn]; void init() { ip=0,num=0; maxsize = maxn*1000; memset(vis,0,sizeof(vis)); memset(head,-1,sizeof(head)); } void add(int u,int v) { edge[ip].to=v; edge[ip].next=head[u]; head[u]=ip++; } void dfs(int u) { vis[u]=1; son[u]=0; int tmpmax=0; for(int i=head[u]; i!=-1; i=edge[i].next) { int v = edge[i].to; if(!vis[v]) { dfs(v); son[u]+=son[v]+1; tmpmax=max(tmpmax,son[v]+1); } } tmpmax = max(tmpmax,n-son[u]-1); if(tmpmax < maxsize) { num = 1; ans[0] = u; maxsize = tmpmax; } else if(tmpmax == maxsize) { ans[num++] = u; } } int main() { while(~scanf("%d",&n)) { init(); for(int i=0; i<n-1; i++) { int u,v; scanf("%d%d",&u,&v); add(u,v); add(v,u); } dfs(1); sort(ans,ans+num); for(int i=0; i<num-1; i++) printf("%d ",ans[i]); printf("%d\n",ans[num-1]); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/bigbigship/article/details/47261031