CF C 题
  • 板块学术版
  • 楼主zhoukangyang
  • 当前回复10
  • 已保存回复10
  • 发布时间2020/9/12 23:51
  • 上次更新2023/11/5 13:18:20
查看原帖
CF C 题
173660
zhoukangyang楼主2020/9/12 23:51

蒟蒻 CF C 题都挂了, 求助。

大概是这样一个思路:

找出所有重心, 重心最多两个。

如果一个重心随便输出。

如果两个重心那么就把一个重心的一个子树给另一个。

代码:

#include<bits/stdc++.h>
#define N 200100
using namespace std;
int T, n, fa[N], siz[N], minn, qwq[N], tot;
int head[N], edge_id;
struct node {
	int to, next;
} e[N << 1]; 
void add_edge(int u, int v) {
	++edge_id, e[edge_id].next = head[u], e[edge_id].to = v, head[u] = edge_id;
}
void dfs(int x) {
	int amax = 0;
	siz[x] = 1;
	for(int i = head[x]; i; i = e[i].next) {
		int v = e[i].to;
		if(v == fa[x]) continue;
		fa[v] = x, dfs(v), siz[x] += siz[v], amax = max(amax, siz[v]);
	} 
	amax = max(amax, n - siz[x]);
	if(amax < minn) 
		minn = amax, qwq[tot = 1] = x;
	else if(amax == minn) 
		qwq[++tot] = x;
}
int main() {
	scanf("%d", &T);
	while(T--) {
		minn = 1e9;
		scanf("%d", &n);
		for(int i = 1; i < n; i++) {
			int u, v;
			scanf("%d%d", &u, &v);
			add_edge(u, v), add_edge(v, u); 
		}
		dfs(1);
		int sa = qwq[1], sb = qwq[2], v = e[head[sa]].to;
		printf("%d %d\n", sa, v);
		if(tot == 1) printf("%d %d\n", sa, v);
		else printf("%d %d\n", sb, v);
		for(int i = 1; i <= edge_id; i++) e[i].to = e[i].next = 0;
		for(int i = 1; i <= n; i++) fa[i] = head[i] = 0;
		tot = edge_id = 0;
	}
	return 0;
} 
2020/9/12 23:51
加载中...