题意:求树的重心,若有多个重心,则输出编号较小者,及其子树中节点最多的数量。

思路:

  树的重心:指的是一个点v,在删除点v后,其子树的节点数分别为:u1,u2....,设max(u)为其中的最大值,点v的max(u)是所有点里面最小的,称v为树的重心。

  如何求任一重心?按树形来看,max(v)可以由其父亲贡献,也可以由其任一孩子贡献。孩子比较好解决,不就是深搜一遍,然后回溯时统计下数量就行了?而父亲的怎么办?可以知道,点v到其父亲这一叉就是n-sum(v)了,sum(v)指的是以v为根的子树的节点数。那么一次DFS就可以知道答案了,复杂度O(n)。

 //#include <bits/stdc++.h>
#include <vector>
#include <iostream>
#include <cstdio>
#include <cstring>
#define pii pair<int,int>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=;
int n, vis[N], cnt[N];
vector<int> vect[N];
int DFS(int x) //深搜求删除任一点后,其某一子树的节点数量达到的最大值。
{
vis[x]=;
int big=,sum=;
for(int i=; i<vect[x].size(); i++)
{
if(!vis[vect[x][i]])
{
int t=DFS(vect[x][i]);
big=max(t,big);
sum+=t;
}
}
cnt[x]=max(big, n-sum-);
return sum+;
} int main()
{
//freopen("input.txt", "r", stdin);
int t,a,b;cin>>t;
while(t--)
{
scanf("%d",&n);
memset(vis,,sizeof(vis));
memset(cnt,,sizeof(cnt));
for(int i=; i<=n; i++) vect[i].clear();
for(int i=; i<n; i++)
{
scanf("%d%d",&a,&b);
vect[a].push_back(b);
vect[b].push_back(a);
}
DFS();
int big=INF, pos;
for(int i=; i<=n; i++)
{
if(cnt[i]<big)
{
big=cnt[i];
pos=i;
}
}
printf("%d %d\n", pos, big);
}
return ;
}

AC代码

最新文章

  1. tomcat发布脚本
  2. 外网访问原理分析 - 每天5分钟玩转 OpenStack(105)
  3. spring初次体验
  4. unity3d android 优化
  5. [Java面试二]Java基础知识精华部分.
  6. 编程作业—C++初探 简单的学生信息处理程序实现
  7. MSP430常见问题之电源类
  8. jquery 在页面中按回车 响应 事件
  9. Codeforces Round #306 (Div. 2) ABCDE(构造)
  10. C#.net连接SQLite及遇到的问题
  11. 第四章 android 命名规范和编码规范
  12. 理解交互设计之&quot;行为设计与对象设计&quot;
  13. MongoDB数据库索引
  14. Angular 向组件传递模板的几种方法
  15. [总结] 二维ST表及其优化
  16. MacOs 安装cordova报无权访问题解决方案
  17. MyEclipse导入Maven项目以及Maven转化为Dynamic Web Module(转)
  18. JSON parse error: Cannot deserialize instance of `int` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc
  19. 4J - 前m大的数
  20. python调用dll方法

热门文章

  1. asp.net中FileUpload得到上传文件的完整路径
  2. HDOJ-1391
  3. jQuery 学习笔记(一)jQuery 语法
  4. 看后端程序员调试CORS的姿势
  5. laravel 遍历循环
  6. C++两个类相互引用错误留影
  7. dzzoffice 任意文件删除漏洞分析
  8. POJ-3159-Candies-(差分约束,Dijkstra)
  9. siege官方文档(译)(一)
  10. [已读]JavaScript语言精髓与编程实践