首页 > 其他分享 >CF1406C Link Cut Centroids

CF1406C Link Cut Centroids

时间:2024-08-08 10:30:08浏览次数:8  
标签:sz head Cut idx int Centroids getroot Link mx

思路

如果一棵树有两个重心,那么从一个重心的一边切割一个点到另外一个重心即可。

如果一棵树只有一个重心,那么随意断掉一个点再恢复即可。

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 100010;

struct edge {
	int to, next; 
} e[N * 2];

int head[N], idx = 1;

void add(int u, int v) {
	idx++, e[idx].to = v, e[idx].next = head[u], head[u] = idx;
}

int sz[N];
int n;
int mx[N];
vector<int> ans;

void getroot(int u, int fa) {
	sz[u] = 1;
	mx[u] = 0;
	for (int i = head[u]; i; i = e[i].next) {
		int to = e[i].to;
		if (to == fa) continue;
		getroot(to, u);
		mx[u] = max(mx[u], sz[to]);
		sz[u] += sz[to];
	}
	mx[u] = max(mx[u], n - sz[u]);
	if (mx[u] * 2 <= n) {
		ans.push_back(u);
	}
}

int del_edge, last;

void dfs(int u, int fa) {
	// cout << u << ' ' << fa << endl;
	last = u;
	for (int i = head[u]; i; i = e[i].next) {
		int to = e[i].to;
		if (to == fa) continue;
		del_edge = i;
		dfs(to, u);
	}
}

void solve() {
	memset(head, 0, sizeof(int) * (n + 10));
	memset(mx, 0, sizeof(int) * (n + 10));
	idx = 1;
	ans.clear();
	
	cin >> n;
	for (int i = 1; i < n; i++) {
		int x, y;
		cin >> x >> y;
		add(x, y), add(y, x);
	}
	getroot(1, 0);
	if (ans.size() == 1) {
		cout << e[3].to << ' ' << e[2].to << '\n';
		cout << e[3].to << ' ' << e[2].to << '\n';
	}
	else {
		del_edge = 0;
		dfs(ans[0], ans[1]);
		cout << e[del_edge].to << ' ' << e[del_edge ^ 1].to << '\n';
		cout << e[del_edge].to << ' ' << ans[1] << '\n';
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int T;
	cin >> T;
	while (T--) solve();
	return 0;
}

标签:sz,head,Cut,idx,int,Centroids,getroot,Link,mx
From: https://www.cnblogs.com/Yuan-Jiawei/p/18348441

相关文章

  • Robot Operating System——深度解析单线程执行器(SingleThreadedExecutor)执行逻辑
    大纲创建SingleThreadedExecutor新增Nodeadd_nodetrigger_entity_recollectcollect_entities自旋等待get_next_executablewait_for_workget_next_ready_executableTimerSubscriptionServiceClientWaitableAnyExecutableexecute_any_executable参考资料在ROS2中,我......
  • 【数据结构】LinkedList与链表
    目录链表1、链表的概念及结构 2、LinkedList的使用2、1什么是LinkedList2、2LinkedList的使用3、LinkedList的遍历4、LinkedList的模拟实现 5、ArrayList和LinkedList的区别上篇已经熟悉了ArrayList的使用,ArrayList底层使用数组来存储元素。由于其底层是一段连续......
  • 【变压器的短路试验】变压器的短路试验是通过将二次侧短路,并向一次侧施加额定电流来进
       ......
  • 基于dq0变换的三相并联有源电力滤波器研究(Simulink仿真实现)
     ......
  • INLINE Data Link Adapters for Engine Diagnostics
    INLINEdatalinkadaptersaredesignedtofacilitatecommunicationbetweentheengine'sECM(ElectronicControlModule)anddiagnostictools.Availableinthreemodels,theseadapterscanbesourcedfromyourlocalCumminsdealerordistributor:INLIN......
  • 4、Flink SQL 与 DataStream API 集成处理 Insert-Only 流详解
    处理Insert-Only流StreamTableEnvironment提供以下方法来从DataStream转换和转换到DataStream:fromDataStream(DataStream):将insert-only和任意类型的流转换为表,默认情况下不传播事件时间和水印。fromDataStream(DataStream,Schema):将insert-only和任意类型......
  • 基于simulink的分布式发电系统自动重合闸的建模与仿真分析
    1.课题概述      在配电系统中,80%-90%的故障都是瞬时故障。发生故障时,线路被保护迅速断开,随即重合闸。当分布式电源接入配电网后,线路发生故障后重合闸,此时分布式电源没有跳离线路,这将产生两种潜在威胁,即非同期重合闸和故障点电弧重燃。      非同期重合闸:当线路......
  • Flink实战(10)-checkpoint容错保证
    0前言程序在Flink集群运行,某个算子因为某些原因出现故障,如何处理在故障恢复后,如何保证数据状态,和故障发生之前的数据状态一致?1什么是checkpoint(检查点)?Checkpoint能生成快照(Snapshot)。若Flink程序崩溃,重新运行程序时可以有选择地从这些快照进行恢复。Checkpoin......
  • [Redis]unlink and delete
    redis中的大key和unlink操作1、什么是bigkeyKey本身的数据量过大:一个String类型的Key,它的值为5MB。Key中的成员数过多:一个ZSET类型的Key,它的成员数量为10,000个。Key中成员的数据量过大:一个Hash类型的Key,它的成员数量虽然只有1,000个但这些成员的Value(值)......
  • ArrayList和LinkList实现的比较
    一、ArrayList和LinkList实现的比较1.使用get()获取元素1.1ArrayList.get()​ 如果希望使用ArrayList的get(intindex)方法获取元素,实现可以简单地将这项任务委托给其内部数组:publicEget(intindex){rangeCheck(index);returnelementData(index);}​ 当然,......