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

题目


思路

分类讨论。

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

再看有两个重心的情况.

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

即删掉 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.hqwc.cn/news/452494.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElementUI Form:Upload 上传

ElementUI安装与使用指南 Upload 上传 点击下载learnelementuispringboot项目源码 效果图 el-upload.vue&#xff08;Upload上传&#xff09;页面效果图 el-upload.vue代码 import Vue from vue import VueRouter from vue-router import HomeView from ../views/HomeV…

基于Springboot的兼职网(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的兼职网&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0…

幻兽帕鲁服务器怎么搭建?Palworld多人联机教程

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

openGauss学习笔记-213 openGauss 性能调优-总体调优思路

文章目录 openGauss学习笔记-213 openGauss 性能调优-总体调优思路213.1 调优思路概述213.2 调优流程 openGauss学习笔记-213 openGauss 性能调优-总体调优思路 213.1 调优思路概述 openGauss的总体性能调优思路为性能瓶颈点分析、关键参数调整以及SQL调优。在调优过程中&…

[职场] 老教师对年轻教师的肺腑之言 #媒体#笔记

老教师对年轻教师的肺腑之言 对学生 不要拖堂&#xff01;不要拖堂&#xff01;不要拖堂&#xff01;临下课十分钟&#xff0c;学生已经心不在焉&#xff0c;更别说下课后了&#xff01;有什么内容等下节课再说&#xff0c;不连贯没关系&#xff0c;反正拖堂讲课他们更听不进去…

算法学习——华为机考题库3(HJ21 - HJ25)

算法学习——华为机考题库3&#xff08;HJ21 - HJ30&#xff09; HJ21 简单密码 描述 现在有一种密码变换算法。 九键手机键盘上的数字与字母的对应&#xff1a; 1–1&#xff0c; abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0&#xff0c;把密码…

Linux 驱动开发基础知识——内核对设备树的处理与使用(十)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

Linux权限【超详细】

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 扩展知识&#xff1a…

基于WordPress开发微信小程序2:决定开发一个wordpress主题

上一篇&#xff1a;基于WordPress开发微信小程序1&#xff1a;搭建Wordpress-CSDN博客 很快发现一个问题&#xff0c;如果使用别人的主题模板&#xff0c;多多少少存在麻烦&#xff0c;所以一咬牙&#xff0c;决定自己开发一个主题模板&#xff0c;并且开源在gitee上&#xff…

C#,墨瑟 德·布鲁因数(Moser de Bruijn)的算法与源代码

1 墨瑟 德布鲁因数&#xff08;Moser de-Bruijn&#xff09; 墨瑟 德布鲁因数&#xff08;Moser de-Bruijn&#xff09;序列是将数字4&#xff08;例如&#xff0c;1、4、16、64等&#xff09;的不同幂相加得到的序列。 计算公式&#xff1a; 1) S(2 * n) 4 * S(n) 2) S(2 …

前端JavaScript篇之JavaScript 类数组对象的定义?如何将类数组对象转换为真正的数组

目录 JavaScript 类数组对象的定义&#xff1f;如何将类数组对象转换为真正的数组如何将类数组对象转换为真正的数组 JavaScript 类数组对象的定义&#xff1f;如何将类数组对象转换为真正的数组 类数组对象指的是具有类似数组结构&#xff08;类似于数组的属性或方法&#xf…

VS2019+CAXACAD2023二次开发教程(一、环境搭建)

前言 CAXACAD2023的二次开发相关文件和库都在installpath\CRX\的文件夹下。 CAXACAD2023的默认开发环境是VS2019,如果是用VS2019的环境话,可以直接安装"installpath\CRX\Wizard\CRXWizard_VS2019.exe"这个插件,安装好后就可以一键新建的项目,新建的项目会自动帮…