题目大意:
  给定一棵n个结点的树,求一个点x作为根,使得所有结点到x的距离和最小。

思路:
  树形DP。
  首先考虑将1作为根的情况。
  很显然我们可以用一遍O(n)的DFS预处理出每个结点所对应子树大小size和子树内每个结点到这个结点的距离和sum。
  这样也就相当于我们递推求出了以1作为根时各结点到它的距离和。
  现在考虑将根往下转移。
  假设我们现在要从u转移到v,那么显然在sum[u]的基础上,sum[v]需要变化的是(u,v)之间的连接的边。
  也就是说sum[y]=sum[x]+n-size[y]*2。
  这样我们就可以用O(n)时间将根往下转移。
  总的时间复杂度还是O(n)的。

 #include<cstdio>
#include<cctype>
typedef long long int64;
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=;
int head[N],to[N<<],next[N<<],sz;
inline void add_edge(const int &u,const int &v) {
to[++sz]=v; next[sz]=head[u]; head[u]=sz;
to[++sz]=u; next[sz]=head[v]; head[v]=sz;
}
int64 sum[N],max;
int n,size[N],root;
void dfs(const int &x,const int &par) {
size[x]=;
for(int i=head[x];i;i=next[i]) {
const int &y=to[i];
if(y==par) continue;
dfs(y,x);
size[x]+=size[y];
sum[x]+=sum[y]+size[y];
}
}
void move(const int &x,const int &par) {
if(sum[x]>max) {
max=sum[x];
root=x;
} else if(sum[x]==max&&x<root) {
root=x;
}
for(int i=head[x];i;i=next[i]) {
const int &y=to[i];
if(y==par) continue;
sum[y]=sum[x]+n-size[y]*;
move(y,x);
}
}
int main() {
n=getint();
for(register int i=;i<n;i++) {
add_edge(getint(),getint());
}
dfs(,);
move(,);
printf("%d\n",root);
return ;
}

最新文章

  1. swift学习笔记4——扩展、协议
  2. Squirrel: 通用SQL、NoSQL客户端
  3. [LeetCode] LFU Cache 最近最不常用页面置换缓存器
  4. Navigation Bar options for Android (based on photosomething project)
  5. ZeroMQ接口函数之 :zmq_connect - 由一个socket创建一个对外连接
  6. 解决web中的乱码
  7. 有关PHP、HTML单引号、双引号转义以及转成HTML实体的那些事!
  8. 【Linux命令与工具】系统资源查看——free、uname、dmesg以及netstat
  9. ALV表头HTML实现
  10. C语言基础--函数
  11. mysql sql获取上条插入id,update影响行数
  12. 查看哪些进程占用了SWAP分区?
  13. Android硬件抽象层(HAL)概要介绍和学习计划
  14. 第 7 章 MySQL 数据库锁定机制
  15. jar包中File 文件找不到的异常分析与解决
  16. function &quot;round&quot; declared implicitly
  17. linux下postgres未能正常启动的解决过程
  18. 第十四章 Java常用类
  19. 在Linux上安装Elasticsearch Kibaba.md
  20. MySQL查询表结构的SQL语句

热门文章

  1. Codeforces Round #525 (Div. 2)E. Ehab and a component choosing problem
  2. ${pageContext.request.contextPath}的解释以及和request.contextPath的区别
  3. TCP(一)
  4. 之江学院第0届校赛 qwb与支教 (容斥公式)
  5. Python学习笔记 - day5 - 文件操作
  6. windows启动redis服务
  7. HDU2819(二分图匹配,记录过程)
  8. 在opensuse 中安装视频解码器
  9. Linux下查看使用的是哪种shell的方法汇总【转】
  10. Java易错知识点(1) - 关于ArrayList移除元素后剩下的元素会立即重排