代码改变世界

重建道路

2019-05-16 19:53  一只弱鸡丶  阅读(173)  评论(0编辑  收藏  举报

传送门

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define ll long long
#define re register
inline void read(int &a)
{
    a=0;
    int d=1;
    char ch;
    while(ch=getchar(),ch>'9'||ch<'0')
        if(ch=='-')
            d=-1;
    a=ch^48;
    while(ch=getchar(),ch>='0'&&ch<='9')
        a=(a<<3)+(a<<1)+(ch^48);
    a*=d;
}
int f[201][201],r[201],head[201],num,p;
struct note
{
    int to,next;
}edge[201];
inline void add(int u,int v)
{
    edge[++num].next=head[u];
    edge[num].to=v;
    head[u]=num;
}
inline void dfs(int u,int fa)
{
    for(re int i=head[u];i;i=edge[i].next)
    {
        if(edge[i].to!=fa)
        {
            dfs(edge[i].to,u);
            for(re int j=p;j>=1;j--)
                for(re int k=1;k<j;k++)
                    f[u][j]=min(f[u][j],f[edge[i].to][j-k]+f[u][k]-2);
        }
    }
}
int main()
{
    int n;
    read(n);
    read(p);
    for(re int i=1;i<n;i++)
    {
        int a,b;
        read(a);
        read(b);
        r[a]++;
        r[b]++;
        add(a,b);
        add(b,a);
    }
    memset(f,0x3f,sizeof(f));
    for(re int i=1;i<=n;i++)
        f[i][1]=r[i];
    dfs(1,0);
    int ans=f[1][p];
    for(re int i=1;i<=n;i++)
        ans=min(ans,f[i][p]);
    printf("%d",ans);
    return 0;
}