蒟蒻90(#2RE)求助
  • 板块P1395 会议
  • 楼主foglake
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/6/9 19:15
  • 上次更新2023/10/23 13:34:21
查看原帖
蒟蒻90(#2RE)求助
763215
foglake楼主2023/6/9 19:15

谢谢!

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int si[maxn], dp[maxn], f[maxn];
int n, wh = 2e9, mi = 2e9;
vector <int> v[maxn];
void dfs(int x, int fr) {
	f[x] = fr;
	si[x] = 1;
	if (!x) return;
	for (int i = 0; i < v[x].size(); i++)
		if (v[x][i] != fr) {
			dfs(v[x][i], x);
			si[x] += si[v[x][i]];
		}
}
void Dp(int x) {
	if (x > 1) dp[x] = dp[f[x]] + n - 2 * si[x];
	if (dp[x] < mi) {
		mi = dp[x];
		wh = x;
	}
	if (dp[x] == mi) wh = min(wh, x);
	if (!x) return;
	for (int i = 0; i < v[x].size(); i++)
		if (v[x][i] != f[x]) Dp(v[x][i]);
}
int main() {
	scanf("%d", &n);
	for (int i = 1; i < n; i++) {
		int u, V;
		scanf("%d%d", &u, &V);
		v[u].push_back(V);
		v[V].push_back(u);
	}
	dfs(1, 0);
	for (int i = 1; i <= n; i++) dp[1] += si[i];
	dp[1] -= n;
	Dp(1);
	printf("%d %d", wh, mi);
}
2023/6/9 19:15
加载中...