比赛 EYOI与SBOI开学欢乐赛7th 评测结果 AAWAAAAAAATWAA
题目名称 重建道路 最终得分 78
用户昵称 Skloud 运行时间 1.000 s
代码语言 C++ 内存使用 0.17 MiB
提交时间 2022-09-23 20:44:51
显示代码纯文本
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
int n,p,x,y,k,ans=200;
int tot,head[155],v[155],ne[155],fa[155];
int num[155];
void upgrade(int n)
{
    for(int i=head[n];i;i=ne[i])
    {
        upgrade(v[i]);
        num[n]+=num[v[i]];
    }
}
inline void add(int a,int b)
{
    v[++tot]=b;
    ne[tot]=head[a];
    head[a]=tot;
}
void dfs(int x,int y,int time,int n)
{
    if(y>n-p) return;
    if(y==n-p){ans=min(ans,time);return;}
    for(int i=head[x];i;i=ne[i])
    {
        if(num[v[i]]==p){ans=1;return;}
        if(num[v[i]]>p) dfs(v[i],0,1,num[v[i]]);
        dfs(v[i],y,time,n);
        dfs(v[i],num[v[i]]+y,time+1,n);
    }
}
int main()
{
    freopen("reroads.in","r",stdin);
    freopen("reroads.out","w",stdout);
    scanf("%d%d",&n,&p);
    for(int i=1;i<=n;i++) num[i]++;
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        add(x,y);
    }
    upgrade(1);
    dfs(1,0,0,n);
    printf("%d\n",ans);
    return 0;
}