洛谷1272

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std;
int indg[152],n,p,cnt,f[152][152],head[152],nex[302],to[302];

void inline read(int &x){
    char ch=getchar();x=0;
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
} 

void addedge(int u,int v){
    to[++cnt]=v;nex[cnt]=head[u];head[u]=cnt;
}

void dfs(int now,int fa){
    f[now][1]=indg[now];
    for(int i=head[now];i;i=nex[i]){
        int v=to[i];
        if(v==fa)continue;
        dfs(v,now);
        for(int j=p;j>0;j--)
           for(int k=1;k<j;k++)
              f[now][j]=min(f[now][j],f[now][k]+f[v][j-k]-2);//注意:这里是-2,因为在dfs(v)时在已经把所有与u和edge[i].to相连接的节点给砍掉了,但是u和edge[i].to相连的的度应该保留,而这段相连的度,在u中加了一次,在to中也加了一次,所以应该-2 
    }
}

int main(){
    read(n);read(p);
    memset(f,0x3f,sizeof(f));
    for(int i=1;i<n;i++){
        int u,v;read(u);read(v);
        indg[u]++;indg[v]++;
        addedge(u,v);addedge(v,u);
    }
    dfs(1,0);
    int ans=1e9;
    for(int i=1;i<=n;i++)ans=min(ans,f[i][p]);
    printf("%d",ans); 
}

猜你喜欢

转载自www.cnblogs.com/MikuKnight/p/9016461.html