[POI2008]Station
2024-08-25 23:13:33
题目大意:
给定一棵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 ;
}
最新文章
- swift学习笔记4——扩展、协议
- Squirrel: 通用SQL、NoSQL客户端
- [LeetCode] LFU Cache 最近最不常用页面置换缓存器
- Navigation Bar options for Android (based on photosomething project)
- ZeroMQ接口函数之 :zmq_connect - 由一个socket创建一个对外连接
- 解决web中的乱码
- 有关PHP、HTML单引号、双引号转义以及转成HTML实体的那些事!
- 【Linux命令与工具】系统资源查看——free、uname、dmesg以及netstat
- ALV表头HTML实现
- C语言基础--函数
- mysql sql获取上条插入id,update影响行数
- 查看哪些进程占用了SWAP分区?
- Android硬件抽象层(HAL)概要介绍和学习计划
- 第 7 章 MySQL 数据库锁定机制
- jar包中File 文件找不到的异常分析与解决
- function ";round"; declared implicitly
- linux下postgres未能正常启动的解决过程
- 第十四章 Java常用类
- 在Linux上安装Elasticsearch Kibaba.md
- MySQL查询表结构的SQL语句
热门文章
- Codeforces Round #525 (Div. 2)E. Ehab and a component choosing problem
- ${pageContext.request.contextPath}的解释以及和request.contextPath的区别
- TCP(一)
- 之江学院第0届校赛 qwb与支教 (容斥公式)
- Python学习笔记 - day5 - 文件操作
- windows启动redis服务
- HDU2819(二分图匹配,记录过程)
- 在opensuse 中安装视频解码器
- Linux下查看使用的是哪种shell的方法汇总【转】
- Java易错知识点(1) - 关于ArrayList移除元素后剩下的元素会立即重排