题目描述
小G想要把自己家院子里的橘子树搬到家门口(QAQ。。就当小G是大力水手吧)
可是小G是个平衡性灰常灰常差的人,他想找到一个这个橘子树的平衡点。
怎么描述这棵树呢。。。就把它看成由一个个节点构成的树吧。结点数就
代表树重。
输入描述:
多组数据输入输出,
第一行包含一个整数n(3<=n<=1000)代表树的结点的个数
以下n-1行描述(1-n)节点间的连接关系。
思路:找树的重心,就是找到节点的最大子树子树最小的点。
代码:
#include <iostream> #include <bits/stdc++.h> using namespace std; int sonnum[1005]; vector<int>edge[1005]; int ansid,anssum=0x3f3f3f3f,n; void dfs(int u,int pre) { int maxnum=0; sonnum[u]=1; for(int i=0;i<edge[u].size();i++){ int v=edge[u][i]; if(v==pre)continue; dfs(v,u); sonnum[u]+=sonnum[v]; if(sonnum[v]>maxnum)maxnum=sonnum[v]; } maxnum=max(maxnum,n-sonnum[u]); if(maxnum<anssum){ ansid=u; anssum=maxnum; }else if(maxnum==anssum&&u<ansid){ ansid=u; } } int main() { scanf("%d",&n); for(int i=1;i<n;i++){ int u,v; scanf("%d%d",&u,&v); edge[u].push_back(v); edge[v].push_back(u); } dfs(1,-1); printf("%d %d\n",ansid,anssum); return 0; }