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