poj1655 树重心
题意:求树重心 如果存在2个重心 输出结点序号小的一个
思路:板子题 注意在具有多个重心的时候判断一下选择结点序号小的作为答案就可以了
AC代码:
#include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #include "vector" #include "set" #include "map" #include "algorithm" #include "stdio.h" #include "math.h" #define ll long long #define bug cout<<"UUUUUUUU<<endl; #define mem(a) memset(a,0,sizeof(a)) using namespace std; struct Edge{ int to,next; }; Edge e[100005]; int head[100005],vis[100005],son[100005],n,cnt,ans,si; void Init(){ memset(head,-1,sizeof(head)); memset(vis,0,sizeof(vis)); cnt=0; ans=0; si=2000005; } void add(int u, int v){ e[cnt].to=v; e[cnt].next=head[u]; head[u]=cnt++; } void Dfs(int u){ vis[u]=1; son[u]=0; int tmp=0; for(int i=head[u]; i!=-1; i=e[i].next){ int v=e[i].to; if(vis[v]) continue; Dfs(v); son[u]+=son[v]+1; tmp=max(tmp,son[v]+1); } tmp=max(tmp,n-son[u]-1); if(si>tmp || (tmp==si && u<ans) ){ ans=u; si=tmp; } } int main(){ int t,a,b; scanf("%d",&t); while(t--){ Init(); scanf("%d",&n); for(int i=1; i<n; ++i){ scanf("%d%d",&a,&b); add(a,b); add(b,a); } Dfs(1); printf("%d %d\n",ans,si); } return 0; }