比赛 EYOI与SBOI开学欢乐赛7th 评测结果 AAAAAAAAAAAAAA
题目名称 重建道路 最终得分 100
用户昵称 ZRQ 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2022-09-23 20:45:34
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<vector> 
#include<cstring>
using namespace std;
const int N=155,INF=0x3f3f3f3f;
int n,m,siz[N],dp[N][N],tmp[N][N],ans=INF;
vector<int> son[N];
char ch;
inline void read(int &x){x=0;ch=getchar();while(ch<48||ch>57)ch=getchar();while(ch>47&&ch<58)x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return ;}
void DFS(int p)
{
	dp[p][0]=0;
	for(int i=0;i<son[p].size();++i)
	{
		int q=son[p][i];
		DFS(q);
		memset(tmp,0x3f,sizeof(tmp));
		for(int j=0;j<=siz[p];++j)
			for(int k=1;k<=siz[q];++k)
				tmp[p][j+k]=min(tmp[p][j+k],dp[p][j]+dp[q][k]);
		siz[p]+=siz[q];
		for(int j=0;j<=siz[p];++j) dp[p][j]=min(dp[p][j],tmp[p][j]);
	}
	++siz[p];
	dp[p][siz[p]]=1;
	if(siz[p]>m)
		if(p!=1) ans=min(ans,dp[p][siz[p]-m]+1);
		else ans=min(ans,dp[p][siz[p]-m]);
	else if(siz[p]==m) ans=1;
	return ;
}
int main()
{
	freopen("reroads.in","r",stdin);
	freopen("reroads.out","w",stdout);
	memset(dp,0x3f,sizeof(dp));
	read(n),read(m);
	if(m==n)
	{
		printf("0");
		return 0;
	}
	for(int i=1,j,k;i<n;++i)
		read(j),read(k),son[j].push_back(k);
	DFS(1);
	printf("%d",ans);
	return 0;
}