| 比赛 | 
    EYOI与SBOI开学欢乐赛7th | 
    评测结果 | 
    AAAAAAAAAAAAAA | 
    | 题目名称 | 
    重建道路 | 
    最终得分 | 
    100 | 
    | 用户昵称 | 
    湖岸与夜与咸鱼 | 
    运行时间 | 
    0.000 s  | 
    | 代码语言 | 
    C++ | 
    内存使用 | 
    0.00 MiB  | 
    | 提交时间 | 
    2022-09-23 20:43:25 | 
显示代码纯文本
// 河南省实验中学 21急 关天泽 
#include <bits/stdc++.h>
#define N 151
#define INF 0x7f7f7f7f
using namespace std;
int dp[N][N], head[N], d[N];
int n, m, ans, cnt;
struct node{
    int u,v,next; 
}e[N<<1];
void add(int u,int v){
    e[++cnt].v = v;
	e[cnt].next = head[u];
	head[u] = cnt;
}
void dfs(int u,int fa){
    dp[u][1] = d[u];
    for(int i = head[u]; i; i = e[i].next){
        if(e[i].v != fa){
            dfs(e[i].v, u);
            for(int j = m; j >= 1; j--)
              for(int k = 1; k <= j; k++)
                dp[u][j] = min(dp[u][j], dp[e[i].v][k] + dp[u][j - k] - 2);
        }
    }
	ans = min(ans, dp[u][m]);
}
int main(){
	freopen("reroads.in", "r", stdin);
	freopen("reroads.out", "w", stdout);
    int x, y;
    memset(dp, 1, sizeof dp);
    cin >> n >> m;
    for(int i=1;i<n;i++)
    {
        cin >> x >> y;
        add(x, y);
		add(y, x);
        d[x]++;d[y]++;
    }
    ans = INF;
    dfs(1, 0);
    cout << ans << endl;
    return 0;
}