题目链接:​​传送门​

​别人的题解​​​ 想不到啊想不到
白学了

/**
* @Date: 2019-03-19T14:34:08+08:00
* @Last modified time: 2019-03-19T16:13:22+08:00
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <complex>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define
#define

using namespace std;
typedef long long ll;
struct node {
int next, to;
}e[A];
int head[A], num;
void add(int fr, int to) {
e[++num].next = head[fr];
e[num].to = to;
head[fr] = num;
}
int n, p, a, b, fa[A], f[A][A], in[A], ans = 0x3f3f3f3f, siz[A];
void dfs(int fr) {
siz[fr] = 1;
for (int i = head[fr]; i; i = e[i].next) {
int ca = e[i].to;
if (ca == fa[fr]) continue;
fa[ca] = fr;
dfs(ca);
for (int j = p; j >= 1; j--)
for (int k = 1; k < j; k++)
f[fr][j] = min(f[fr][j], f[ca][j - k] + f[fr][k] - 2);
siz[fr] += siz[ca];
}
ans = min(ans, f[fr][p]);
}

int main(int argc, char const *argv[]) {
cin >> n >> p; memset(f, 0x3f, sizeof f);
for (int i = 1; i < n; i++) {
cin >> a >> b;
add(a, b); add(b, a);
in[a]++; in[b]++;
}
for (int i = 1; i <= n; i++) f[i][0] = 0, f[i][1] = in[i];
dfs(1);
cout << ans << endl;
return 0;
}