题解:P14740 [ICPC 2021 Seoul R] Logistical Warehouse 2
kaikai_qwq · · 题解
考虑贪心加 DP。
考虑抽象为一个覆盖问题,每次选择一个点,就会覆盖所有离其距离
我们维护
转移是容易的:
若
若
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 1e5 + 10;
int n, k;
int dp[MAXN][2];
int ans;
vector <int> G[MAXN];
void dfs(int u, int fa) {
dp[u][0] = 1e18;
for (auto v : G[u]) {
if (v == fa) continue;
dfs(v, u);
dp[u][0] = min(dp[u][0], dp[v][0] + 1);
dp[u][1] = max(dp[u][1], dp[v][1] + 1);
}
if (dp[u][1] >= k) {
ans++;
dp[u][1] = -1;
dp[u][0] = 0;
}
if (dp[u][0] + dp[u][1] <= k) dp[u][1] = -1;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> k;
for (int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1, 0);
if (dp[1][1] != -1) ans++; // 注意这里,未覆盖完还需要再选一个
cout << ans;
return 0;
}