#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int inf = 1000000;
#define N 151
int d[N][N];
int cld[N], bro[N];
bool fa[N];
int n, p;
void dfs(int s){
for (int i = 0; i <= p; i++)d[s][i] = inf;
d[s][1] = 0;
int k = cld[s];
while (k){
dfs(k);
for (int i = p; i >= 0; i--){
int tmp = d[s][i] + 1;
for (int j = 0; j <= i; j++){
tmp = min(tmp, d[k][j] + d[s][i - j]);
}
d[s][i] = tmp;
}
k = bro[k];
}
}
int main(){
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
scanf("%d %d", &n, &p);
int a, b;
for (int i = 1; i <= n; i++)cld[i] = 0;
memset(fa, 0, sizeof(fa));
for (int i = 0; i < n - 1; i++){
scanf("%d %d", &a, &b);
bro[b] = cld[a];
cld[a] = b;
fa[b] = true;
}
int root;
for (int i = 1; i <= n; i++)
if (fa[i] == 0)root = i;
dfs(root);
int ans = d[root][p];
for (int i = 1; i <= n; i++){
if (d[i][p] < ans)ans = d[i][p] + 1;
}
printf("%d\n", ans);
return 0;
}
POJ 1947 Rebuilding Roads(树状DP)
最新推荐文章于 2023-08-09 11:22:56 发布