vj地址
题目大意:找到每一颗子树的重心
思路
树的重心的性质:

  1. 树的重心如果不唯一,则至多有两个,且这两个重心相邻

  2. 通过连接一条端点分别在两个树的边,来将两个树合并成一个,那么新的重心肯定是在原来这两个树的重心的路径上(两颗树合并重心的转移)
    (应该不会有人不知道树的重心的定义吧)

根据这个每次合并两个树的时候,找到新树的重心,就在两个重心的路径上,该路径一定会经过根节点,所以我们转移重心的时候最多转移到根节点就好了。

具体细节代码有注释

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define re register
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(a) ((a)&-(a))
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
#define fi first
#define se secondusing namespace std;
typedef long long  ll;
typedef unsigned long long  ull;
typedef pair<int,int > pii;
int dx[4]= {-1,1,0,0},dy[4]= {0,0,1,-1};
const ll mod=2520;
const int N=2e5+10;
int n;
int son[N],d[N],vis[N],p[N],dp[N];
vector <int> g[200010];
vector<int> ans[N];
//转移,只有满足son[x]<son[u]-son[x]的才能够转移,x==u时就不能够转移了,两棵树转移到最后的时候,
//深度更大的那个必然是重心,不是重心的会一直走到树根点,如果有两个重心那一定是重心的父节点
void up(int u,int x,int y){//转移向上爬while(x!=u&&son[x]<son[u]-son[x]){x=p[x];}while(y!=u&&son[y]<son[u]-son[y]){y=p[y];}if(d[x]>d[y]) dp[u]=x;else dp[u]=y;
}
void dfs(int u,int f){//树形dpvis[u]=1;dp[u]=u;son[u]=1;p[u]=f;d[u]=d[f]+1;for(int v:g[u]){if(v==f||vis[v]) continue;dfs(v,u);son[u]+=son[v];up(u,dp[u],dp[v]);//合并两颗树找到重心}
}
int main(){scanf("%d",&n);for(int i=1;i<=n-1;i++){int u,v;scanf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}dfs(1,0);for(int i=1;i<=n;i++){if(son[dp[i]]==son[i]-son[dp[i]])//判断父节点是不是重心cout<<min(dp[i],p[dp[i]])<<" "<<max(dp[i],p[dp[i]])<<endl;else cout<<dp[i]<<endl;}return 0;
}

M - Kill the tree 计蒜客 - 42552(2019icpc徐州/树的重心/树形dp)相关推荐

  1. 计蒜客网站 ACM-ICPC亚洲区赛题

    The Preliminary Contest for ICPC China Nanchang National Invitational(2019) ACM-ICPC Jiaozuo Onsite ...

  2. 【原创】tyvj1038 忠诚 计蒜客 管家的忠诚 线段树(单点更新,区间查询)...

    [原创]tyvj1038 忠诚 & 计蒜客 管家的忠诚 & 线段树(单点更新,区间查询) 最简单的线段树之一,中文题目,不翻译.... 注释讲的比较少,这已经是最简单的线段树,如果看不 ...

  3. 计蒜客 挑战难题 爬楼梯

    计蒜客 挑战难题 爬楼梯 假设你现在正在爬楼梯,楼梯有n级.每次你只能爬1级或者2级,那么你有多少种方法爬到楼梯的顶部? 格式: 第一行输入一个数n(n<=50),代表楼梯的级数. 接下来一行输 ...

  4. 无脑博士的试管们java_计蒜客 无脑博士和他的试管们

    标签: 无脑博士有三个容量分别是A,B,C升的试管,A,B,C分别是三个从1到20的整数,最初,A和B试管都是空的,而C试管是装满硫酸铜溶液的.有时,无脑博士把硫酸铜溶液从一个试管倒到另一个试管中,直 ...

  5. 最短路(遍历边)计蒜客—DD坐地铁

    题目: C 城有 n 个站点, m 条双向地铁,每条地铁有一个 companyicompany_icompanyi​表示它的公司,如果连续乘坐同一家公司的地铁只要花 1元钱就好.DD现在想出门找萨摩耶 ...

  6. K - Triangle 计蒜客 - 42405

    K - Triangle 计蒜客 - 42405 题意: 给你一个三角形的三点,再给你三角形边上一个点,让你求另一个点(也要在三角形上),使得平分三角形的面积 题解: 计算几何 三角形的三边ab,ac ...

  7. H - Prince and Princess 计蒜客 - 42402

    H - Prince and Princess 计蒜客 - 42402 题意: 你现在要寻找公主,有三种人,第一种是说真话的人(至少为1,因为公主是说真话的人),第二种人是只会说假话的,第三种是胡说八 ...

  8. C - Digital Path 计蒜客 - 42397 05-29

    C - Digital Path 计蒜客 - 42397 题意: 题意就是给出一个n ∗ m的数字矩阵每个矩阵元素之间只能上下左右走,而且下一个位置必须比当前位置的数字大1,入口和出口必须数边缘元素, ...

  9. 计蒜客可以做计算机编程吗,如果你的编程能力不足以支撑你成为工程师的野心,不妨到计蒜客上学学看...

    在人才招聘领域存在这样一个怪圈,高校每年都说是最难就业年.人才过剩,而对于企业HR来说永远都招不到称心如意的人才.这个怪圈在"计蒜客"创始人俞昊然看来,主要是因为当今高校的教学资源 ...

最新文章

  1. PreparedStatement动态参数的引入
  2. C语言将字符串转换成对应的数字(十进制、十六进制)【转】
  3. 【正一专栏】故意豪宅纵火的保姆会判死刑吗?
  4. 关于STM32的IAP与APP互相跳转
  5. 计算机组成原理we指什么,计算机组成原理课后习题答案一到九章
  6. vue 心跳监控_vue websocket 加心跳
  7. Window将Redis设置为开机启动
  8. php如何获取百度快照,PHP获取某网站的百度快照日期方法
  9. NCSDK make install: Error in line 170
  10. 一日一技:ASP.NET Core Api网关Ocelot初探
  11. views.py视图函
  12. pip报错Failed to establish a new connection: [Errno -3] Temporary failure in name resolution‘,)‘
  13. 【计算机网络笔记】计算机网络五层体系结构
  14. 十大验证码解决方案服务比较
  15. 百度地图api 刷新地图_百度地图VS高德地图,谁更胜一筹?
  16. SSL安全证书不受信任怎么办
  17. python图像处理之一 - Pillow的基本用法
  18. 日记侠:原来写文章竟然是为了这个
  19. Wireshark菜单栏介绍
  20. 【Python网络蜘蛛 · 8】:moviepy模块实现音频+视频的合成

热门文章

  1. 怪咖发明家,乔布斯给了他四亿,他没要,转身靠发明救了10亿人。
  2. 这里聚集了优秀的数学老师、家长,有超多惊喜在等你!
  3. Prim 算法及其高效实现
  4. java web容器_Java Web容器安全
  5. composer 查看php 版本_最常用的PHP版本:PHP 7.3取代7.2
  6. python多线程 不在main_从python线程(不是main)启动pyQt线程有什么不...
  7. mysql2012用户名_SQL Server 登录名、服务器角色、用户名和数据库角色 --- 解释
  8. c语言浮点型常量表示平均数_小白基础知识必备|| 整型常量与进制间的转换
  9. matlab dy,高手,请问用matlab如何解下面方程:y*Dy=a+b*y;我的计算结果里面含有wrightOmega ,怎样解出一般解?...
  10. client中周期性边界_「微评」增加艺术品在投资组合中的比例 推进国家艺术软实力...