比赛 |
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;
}