| 比赛 |
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;
}