BZOJ0481. 树的重心之砍树Link Cut Centroids

news2024/10/7 16:24:59

题目


思路

分类讨论。

首先当树只有一个重心的时候,我们删掉最小的边再加上原边即可.

再看有两个重心的情况.

显然这棵树必定是类似这样的:

即删掉 A 后,以B 为根的子树是剩下的最大连通块,反之亦然.

那就可以得到一个结论:

  • 删掉边 (A,B) 后,两棵树的大小相等.

那我们只要使两棵树的大小不相等,且不使新的点成为重心即可.

那就考虑直接从A 树中取一位编号最小叶子节点,把这个节点与它父亲的边断开,连到 B 的直接儿子中编号最小的节点上去.

这样, A 树的大小变小了,而 B 树的大小变大了,且不会有新的节点成为重心.

那 A 就不再是重心了,而 B 则成为了唯一的重心.

 代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct ff
{
  int u,v;
};
ff b[100001];
int n,v[100001],zjd[100001],a[1000001],ans = 1e9,zhong,mnzi = 1e9,mnfa,tzhong,ttzhong,lz,t = 1e9,tt = 1e9;//zjd[x]代表以x为根的子树中最大的子树有多少节点
//v[x]代表 以x为根的子树一共有多少节点
vector<int> vec[300001];
int dfs(int k,int fa)//求树的重心
{
  int sum = 1;
  bool b = 1;
  for(int i:vec[k])
    if(i != fa)
    {
      int u = dfs(i,k);
      if(u > n / 2) b = 0;
      sum += u;
    }
  if(n - sum - 1 >= n / 2) b = 0;
  if(b) a[++zhong] = k;
  return sum;
}
void dfs_2(int x,int fa,int p)
{
  if(p == 1 && x == tzhong) return ;
  if(p == 0 && x == ttzhong) return ;
  if(x < mnzi && fa != 0)
  {
    mnzi = x;
    mnfa = fa;
    lz = p;
  }
  if(p == 0 && t > x) t = x;
  if(p == 1 && tt > x) tt = x;
  for(int i = 0; i < vec[x].size(); i++)
    if(fa != vec[x][i])
      dfs_2(vec[x][i],x,p);
}
bool cmp(ff x,ff y)
{
  if(x.u != y.u) return x.u < y.u;
  return x.v < y.v;
}
signed main()
{
  cin>>n;
  for(int i = 1; i < n; i++)
  {
    int u,v;
    cin>>u>>v;
    vec[u].push_back(v);
    vec[v].push_back(u);
    b[i].u = min(u,v);
    b[i].v = max(u,v);
  }
  sort(b + 1,b + n,cmp);
  dfs(1,0);
  tzhong = a[1];
  ttzhong = a[2];
  if(zhong == 1)
  {
    sort(vec[a[1]].begin(),vec[a[1]].end());
    cout<<a[1]<<' '<<vec[a[1]][0]<<'\n'<<a[1]<<' '<<vec[a[1]][0];
  }
  else
  {
    dfs_2(tzhong,0,0);
    dfs_2(ttzhong,0,1);
    cout<<min(mnzi,mnfa)<<' '<<max(mnzi,mnfa)<<endl;
    if(lz == 0) cout<<min(tt,mnzi)<<' '<<max(tt,mnzi);
    else cout<<min(t,mnzi)<<' '<<max(t,mnzi);
  }
  return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1434177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BrainAGE作为大脑老化的神经影像标志物的十年

随着人口老龄化&#xff0c;神经退行性疾病的发病率越来越高&#xff0c;给个人和整个社会带来越来越大的负担。然而&#xff0c;个体的衰老速度是由环境、基因和表观遗传等各种因素以及各因素间的相互作用决定的。建立神经解剖学衰老过程的生物标志物&#xff0c;是神经科学的…

15:矩阵按键

矩阵按键 1、 矩阵按键的原理图分析2、 矩阵键盘的工作过程3、编程实战3.1、先通过LED灯进行按键测试3.2、通过静态数码管显示键值 1、 矩阵按键的原理图分析 (1)横向和纵向分割 (2)按键两端分别接不同的IO引脚 (3)按键的物理作用不变&#xff1a;按下接通电路&#xff0c;弹起…

ONLYOFFICE:一站式办公,探索高效办公新境界

写在前面ONLYOFFICE 介绍ONLYOFFICE 有哪些优势ONLYOFFICE 文档 8.0 发布如何体验 ONLYOFFICEONLYOFFICE 文档部分页面截图 写在前面 在当今这样一个数字化时代&#xff0c;办公软件已经成为我们日常工作中不可或缺的一部分&#xff0c;熟练使用 Office、WPS、腾讯文档、金山文…

openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志

文章目录 openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志215.1 性能日志概述215.2 性能日志收集的配置参数 openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志 215.1 性能日志概述 性能日志主要关注外部资源的访问性能问题。 性能日…

户用光伏电站设计优化方案:为行业打造示范标杆

不可再生能源的日益消耗促使了大家对新能源的使用和推广&#xff0c;光伏发电已经成为国家和企业大力推崇的技术。其中&#xff0c;户用光伏发电是重要组成部分&#xff0c;有非常大的市场发展空间。然而&#xff0c;如何优化设计&#xff0c;提高效率&#xff0c;降低成本&…

牛客——中位数图(连续子数组和二维前缀和)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 给出1~n的一个排列&#xff0c;统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后&#xff0c;位于中间的数。 输入描述: 第一行为两个正…

Java统计GitLab代码量

1、生成密钥 2、添加依赖 <dependency><groupId>org.gitlab4j</groupId><artifactId>gitlab4j-api</artifactId><version>5.3.0</version></dependency> Java代码实现 统计所有项目的代码行数&#xff1a; private Stri…

C++函数分文件编写之VScode版

VScode实现函数的分文件编写 1.下载插件创建项目2.分文件编写内容3.修改主函数文件名 我在分享内容时经常用的软件是VScode&#xff0c;相信有些内存敏感或需要VScode便利性的小伙伴也是更愿意使用VScode。那么接下来我们就盘一盘怎样使用VScode实现分文件编写。 1.下载插件创建…

2023年06月CCF-GESP编程能力等级认证Python编程二级真题解析

Python等级认证GESP(1~6级)全部真题・点这里 一、单选题(共15题,共30分) 第1题 高级语言编写的程序需要经过以下()操作,可以生成在计算机上运行的可执行代码。 A:编辑 B:保存 C:调试 D:编译 答案:D 第2题 能够实现下面流程图功能的伪代码是( )。 A:if …

动力电池智能工厂数字孪生可视化,助力新能源汽车产业数字化转型

动力电池智能工厂数字孪生可视化&#xff0c;助力新能源汽车产业数字化转型。随着新能源汽车产业的快速发展&#xff0c;动力电池作为新能源汽车的核心组成部分&#xff0c;其生产制造的数字化转型也成为了行业关注的焦点。动力电池智能工厂数字孪生可视化平台作为一种新型的技…

【PyQt5】一些基本操作

文章目录 前言一、查看自己的PyQt版本代码运行结果 二、查看PyQt5 的类或者对象的属性代码运行结果demo_pulsresult 三、帮助文档代码结果 前言 包括以下 查看自己的PyQt版本、查看某个类的使用方法 一、查看自己的PyQt版本 代码 import PyQt5.QtCore print(PyQt5.QtCore.P…

Web html和css

目录 1 前言2 HTML2.1 元素(Element)2.1.1 块级元素和内联(行级)元素2.1.2 空元素 2.2 html页面的文档结构2.3 常见标签使用2.3.1 注释2.3.2 标题2.3.3 段落2.3.4 列表2.3.5 超链接2.3.6 图片2.3.7 内联(行级)标签2.3.8 换行 2.4 属性2.4.1 布尔属性 2.5 实体引用2.6 空格2.7 D…

通过消息队列实现进程之间通信代码

#include <myhead.h> struct msgbuf {long int mtype; char mtext[1024]; }; //定义一个消息大小 #define MSGSIZE sizeof(struct msgbuf)-sizeof(long int) int main(int argc, const char *argv[]) {//1、创建key值以便创建消息队列key_t key ftok("/", k)…

IP代理在网络中解决了哪些问题?代理IP使用时效是什么意思?

随着互联网的普及和发展&#xff0c;IP代理作为一种网络工具&#xff0c;被广泛应用于各种场景。IP代理的使用可以解决很多网络中的问题&#xff0c;提高网络访问的速度和安全性。本文将详细介绍IP代理在网络中解决的问题&#xff0c;以及代理IP使用时效的含义。 一、IP代理在网…

Backtrader 文档学习-Indicators- TA-Lib

Backtrader 文档学习-Indicators- TA-Lib 1.概述 即使BT提供的内置指标数量已经很多&#xff0c;开发指标主要是定义输入、输出并以自然方式编写公式&#xff0c;还是希望使用TA-LIB。原因: 指标X在指标库中&#xff0c;而不在BT中TA-LIB众所周知的&#xff0c;人们信任口碑…

使用SPM_batch进行批量跑脚本(matlab.m)

软件&#xff1a;spm8matlab2023bwin11 数据格式&#xff1a; F:\ASL\HC\CBF\HC_caishaoqing\CBF.nii F:\ASL\HC\CBF\HC_caishaoqing\T1.nii F:\ASL\HC\CBF\HC_wangdonga\CBF.nii F:\ASL\HC\CBF\HC_wangdonga\T1.nii clear spmdirD:\AnalysisApps\spm8; datadirF:\ASL\HC\CBF…

代理IP使用:如何防范潜在的风险?

代理IP用途无处不在。它们允许您隐藏真实IP地址&#xff0c;从而实现匿名性和隐私保护。这对于保护个人信息、绕过地理受限的内容或访问特定网站都至关重要。 然而&#xff0c;正如任何技术工具一样&#xff0c;代理IP地址也伴随着潜在的风险和威胁。不法分子可能会滥用代理IP…

《合成孔径雷达成像算法与实现》Figure6.5

clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.2; % 距离过采样率 Nrg 320; % 距离线采样数 距离向…

上云03 | 数据库事务

文章目录 MySQL线程池禁用存储过程、函数、触发器、视图SQL执行原理执行步骤执行的底层原理详细执行步骤分析**Step 1:获取数据 (From, Join)****Step 2:过滤数据 (Where)****Step 3:分组 (Group by)****Step 4:分组过滤 (Having)****Step 5:返回查询字段 (Select)****Step 6:排…

前端复杂 table 渲染及 excel.js 导出

转载请注明出处&#xff0c;点击此处 查看更多精彩内容 现在我们有一个如图&#xff08;甚至更复杂&#xff09;的表格需要展示到页面上&#xff0c;并提供下载为 excel 文件的功能。 前端表格渲染我们一般会使用 element-ui 等组件库提供的 table 组件&#xff0c;这些组件一般…