cf1406 C 树的重心

news/2024/7/4 13:51:04

题意:https://www.luogu.com.cn/problem/CF1406C

思路:首先需要知道树的重心的一些性质,可以看看这篇文章

https://zhuanlan.zhihu.com/p/357938161

那么这题就是找出重心,如果有两个就将他的一个子树移到另一个重心上。

/*keep on going and never give up*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define int long long
typedef pair<int, int> pii;
#define lowbit(x) x&(-x)
#define endl '\n'
#define wk is zqx ta die
vector<int> pl[100005];
int sz[100005], mss[100005];
vector<int> ctz;
int n;
void dfs(int p, int fa = 0) {
//	cout << p << endl;
	sz[p] = 1;
	mss[p] = 0;
	for (int i : pl[p]) {
		if (i == fa) {
			continue;
		}
		dfs(i, p);
		sz[p] += sz[i];
		mss[p] = max(mss[p], sz[i]);
	}
	mss[p] = max(mss[p], n - sz[p]);
	if (mss[p] <= n / 2) {
		ctz.push_back(p);
	}
}
signed main() {
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while (t--) {
		ctz.clear();
		cin >> n;
		for (int i = 1; i <= n; i++) {
			pl[i].clear();
		}
		for (int i = 1; i < n; i++) {
			int  u, v;
			cin >> u >> v;
			pl[u].push_back(v);
			pl[v].push_back(u);
		}
		if (n & 1) {
			cout << pl[1][0] << " " << 1 << endl;
			cout << 1 << " " << pl[1][0] << endl;
		} else {
			dfs(1);
			if (ctz.size() == 1) {
				cout << pl[1][0] << " " << 1 << endl;
				cout << 1 << " " << pl[1][0] << endl;
			} else {
				int a = ctz[0];
				int b = ctz[1];
//				cout << a << " " << b << endl;
				int h = 0;
				for (int i : pl[a]) {
					if (i == b) {
						continue;
					}
					h = i;
					break;
				}
				cout << a << " " << h << endl;
				cout << h << " " << b << endl;
			}
		}
	}
	return 0;
}


http://lihuaxi.xjx100.cn/news/1305218.html

相关文章

Elasticsearch实战(二十四)---ES数据建模一对多模型Nested结构

Elasticsearch实战—ES数据建模一对多模型Nested结构 文章目录 Elasticsearch实战---ES数据建模一对多模型Nested结构1.ES 一对多模型Nested 结构模型实战2.ES字段查询2.1 非Nested 错误结构及错误查询2.2 Nested结构&#xff0c;正确查询 3.Nested结构原理 我们如何把Mysql的模…

初步学习使用SpringBoot框架

对于SpringBoot框架介绍大家可以看看这个这篇文章&#xff0c;SpringBoot优缺点以及如何安装使用 以下我是按照老师给的安装方法进行安装使用SpringBoot框架&#xff1a; 大家安装SpringBoot框架时候&#xff0c;最好安装3.0以下的&#xff0c;不然需要对应较高版本的JDK版本&…

快速排序的三路划分方法和归并排序的递归和非递归实现

目录 快速排序的三路划分方法 归并排序的递归实现 归并排序的非递归实现 快速排序的三路划分方法 首先快排的时间复杂度为O(N*logN)&#xff0c;空间复杂度O(logN),不稳定。 三路划分&#xff1a;将数据分为三份&#xff1b;可以提高当数据中出现多个重复数字时的效率。 …

有没有免费提取音频的软件,分享几个给大家!

在日常生活中&#xff0c;我们经常遇到需要从视频中提取音频的情况&#xff0c;无论是为了制作音频片段、录制语音笔记还是进行后期编辑。本文将介绍三种免费提取音频的方法&#xff0c;分别是记灵在线工具、PR&#xff08;Adobe Premiere Pro&#xff09;和剪映。通过这些方法…

【新版系统架构】第九章-软件可靠性基础知识

软考-系统架构设计师知识点提炼-系统架构设计师教程&#xff08;第2版&#xff09; 第一章-绪论第二章-计算机系统基础知识&#xff08;一&#xff09;第二章-计算机系统基础知识&#xff08;二&#xff09;第三章-信息系统基础知识第四章-信息安全技术基础知识第五章-软件工程…

基于Springboot+mybatis+mysql+vue实现企业注册模块功能

基于Springbootmybatismysqlvue实现企业注册模块功能 一、系统介绍二、功能展示1.主页面2.注册成功 三、数据库四、代码展示四、其他系统实现五、获取源码 一、系统介绍 该系统实现简单的企业信息注册&#xff0c;保存后&#xff0c;提示注册成功。 运行环境&#xff1a;idea…

哈希表--day6--总结篇

文章目录 数组作为哈希表set作为哈希表map作为哈希表 一般来说哈希表都是用来快速判断一个元素是否出现集合里。 对于哈希表&#xff0c;要知道哈希函数和哈希碰撞在哈希表中的作用. 哈希函数是把传入的key映射到符号表的索引上。 哈希碰撞处理有多个key映射到相同索引上时的…

unity制作游戏,点击鼠标左键,展示屏幕震动效果

在Unity中实现点击鼠标左键展示屏幕震动效果可以通过以下步骤进行&#xff1a; 创建一个新的C#脚本&#xff0c;例如"ScreenShake.cs"&#xff0c;并将其附加到想要添加屏幕震动效果的游戏对象上。 在脚本中定义一个变量来控制震动的幅度&#xff0c;例如public flo…