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

2024-02-04 23:52

本文主要是介绍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;
}

这篇关于BZOJ0481. 树的重心之砍树Link Cut Centroids的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/679177

相关文章

ora-01017 ora-02063 database link,oracle11.2g通过dblink连接oracle11.2g

错误图示: 问题解决 All database links, whether public or private, need username/password of the remote/target database. Public db links are accessible by all accounts on the local database, while private

Shell编程:文本处理器(cut、split、paste、eval 命令)

文章目录 文本处理器 2cut 命令-快速裁剪语法格式常用选项示例 split 命令-文件拆分语法格式常用选项示例 paste 命令-文件合并语法格式常用选项示例 eval 命令-变量扫描器工作原理示例 文本处理器 2 本章讲解 grep、sort、uniq、tr、cut、split、paste 命令等。这些文本处理器通常用于数据过滤、转换、清理、格式化和提取等操作,

C++编译器与链接器工作原理 + Link错误

http://blog.csdn.net/qq_20389175/article/details/44159061 VC项目调试基础 --http://blog.csdn.net/phunxm/article/details/5203931   一.Debug版本和Release版本的区别 Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release称为

CSS - link和@import的区别

页面中使用CSS的方式主要有3种:行内添加定义style属性值,页面头部内嵌调用和外面链接调用,其中外面引用有两种:link和@import。外部引用CSS两种方式link和@import的方式分别是: XML/HTML代码 <link rel="stylesheet" rev="stylesheet" href="CSS文件" type="text/css" media="all

解决Node.js调用fs.renameSync报错的问题(Error: EXDEV, cross-device link not permitted)

在写一个文件上传的功能时候,调用fs.renameSync方法错误 出错 代码所在如下: 1 function upload(response,request){ 2 console.log("upload called"); 3 var form = new formidable.IncomingForm(); 4 console.log("about t

Html中a标签的四个属性 link ,visited , hover ,active 是有顺序的! LVHA

1。html中a标签的四个属性书写是有顺序的,如果顺序不对,显示效果有可能出现差错。 a:link{text-decoration:none ; color:#c00 ;} a:visited {text-decoration:none ; color:#c30 ;} a:hover {text-decoration:underline ; color:#f60 ;} a:active

Pandas-高级处理(八):数据离散化【pandas.cut:根据指定分界点对连续数据进行分箱处理】【pandas.qcut:指定箱子的数量对连续数据进行等宽分箱处理】【get_dummies】

Python实现连续数据的离散化处理主要基于两个函数:pandas.cut和pandas.qcut,pandas.cut根据指定分界点对连续数据进行分箱处理,pandas.qcut可以指定箱子的数量对连续数据进行等宽分箱处理(注意:所谓等宽指的是每个箱子中的数据量是相同的) 应用cut、qcut实现数据的区间分组应用get_dummies实现数据的one-hot编码 数据离散化 可以用来减少

每日一shell之字符处理grep sort uniq cut tr paste split

grep搜索文本 grep -[icvn]‘匹配字符’ 文件名 -i不区分大小写 -c统计匹配行数 -n输出行号 -v反向匹配(就是不包含匹配字符的行) 需要注意的一点是有了-c这个选项输出只有行数,是不会输出内容的 sort排序 sort默认是按字符排序的 sort -[ntkr] 文件名 -n用数字排序 -t指定分割符 -k第几列 -r反向排序 这里就是按字

【战术数据链】Link 22 - 已准备好投入使用

Link 22,又称北约改进型 Link Eleven (NILE),是一种战术数据链通信标准。新标准计划在中期内取代广泛使用的 Link 11,并将与 Link 16 同时使用。 就数字海军通信而言,战术数据链尤为重要。北约和盟国海军使用 Link 11 协议,该协议允许舰船、岸上设施和飞机之间交换雷达跟踪信息和书面消息。Link 11 使用 HF(高频)和 UHF(超高频)通信。Link 2

SCDO完美解决了区块链的“不可能三角”,被看作是ETH2.0+BTC+波卡+Link的集大成者

在区块链领域,有一个理论颇为有名,被称之为“不可能三角理论”。何为“不可能三角”?指的是去中心化,可拓展性,安全性这三项关键性要求无法在一个项目中被同时满足。   比特币堪称是币圈鼻祖,在去“中心化“和“安全性”方面近乎做到了极致,但它的可扩展性却极低。而近几年大火的明星项目EOS,性能极佳,据传甚至可达到百万级别TPS,可为了这个优势,它不得不放弃和牺牲掉自身去中心化的程度。这也是EOS一