比赛 2025.12.13 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 巡逻 最终得分 100
用户昵称 xuyuqing 运行时间 1.901 s
代码语言 C++ 内存使用 53.59 MiB
提交时间 2025-12-13 09:29:34
显示代码纯文本

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <utility>
#include <vector>

using namespace std;

const int N = 2114514;

int n;
int k;
vector<pair<int, int>> tree[N];
int res;
int sum[N];
int maxn;
int id;
int l;
int r;
int fa[N];
int roadId[N];
int dp[N];
int cal;

void dfs (int now, int dad, int d, int road) {
	sum[now] = sum[dad] + d;
	fa[now] = dad;
	roadId[now] = road;
	if (sum[now] > maxn) {
		maxn = sum[now];
		id = now;
	}
	for (int i = 0; i < tree[now].size(); i++) {
		int son = tree[now][i].first;
		int dis = tree[now][i].second;
		if (son == dad) {
			continue;
		}
		dfs (son, now, dis, i);
	}
}

void doDp (int now, int dad) {
	for (int i = 0; i < tree[now].size(); i++) {
		int son = tree[now][i].first;
		int dis = tree[now][i].second;
		if (son == dad) {
			continue;
		}
		doDp (son, now);
		cal = max (cal, dp[now] + dis + dp[son]);
		dp[now] = max (dp[now], dis + dp[son]);
	}
}

int main () {

	freopen ("xunluo.in", "r", stdin);
	freopen ("xunluo.out", "w", stdout);

	cin >> n >> k;
	res = (n - 1) * 2;
	int u, v;
	for (int i = 1; i < n; i++) {
		cin >> u >> v;
		tree[u].emplace_back(v, 1);
		tree[v].emplace_back(u, 1);
	}

	dfs (1, 0, 0, 0);
	l = id;
	maxn = 0;
	dfs (l, 0, 0, 0);
	r = id;
	res -= maxn - 1;
	maxn = 0;

	if (k == 1) {
		cout << res << endl;
		return 0;
	}

	while (r != l) {
		tree[fa[r]][roadId[r]].second = -1;
		r = fa[r];
	}

	doDp (l, 0);
	res -= cal - 1;
	cout << res << endl;
	
	return 0;
}