重建道路
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; }