E. Gardener and Tree 拓扑排序板子

E. Gardener and Tree

将度为1的顶点加入队列,做拓扑排序,记录点的遍历层次,答案为 n-前k层的点的数量

//  AC one more times

void solve()
{

    int n;  cin>>n;
    int k;  cin>>k;
    int st[n+10];memset(st,0,sizeof st);
    vector<int> son[n+10];
    int d[n+10];memset(d,0,sizeof d);
    for(int i=1;i<=n+3;i++)
        son[i].clear();
    
    for(int i=1;i<=n-1;i++)
    {
        int u,v;    cin>>u>>v;
        son[u].pb(v);
        son[v].pb(u);
        d[u]++,d[v]++;
    }
    queue<int> q;
    for(int i=1;i<=n;i++)
    {
        if(d[i]==1)
            q.push(i),st[i]=1;
    }

    while(!q.empty())
    {
        int t=q.front();    q.pop();
        for(auto &it:son[t])
        {
            int j=it;
            if(--d[j]==1)
            {
                st[j]=st[t]+1;
                q.push(j);
            }
        }
    }   
    int ans=0;
    for(int i=1;i<=n;i++)
        if(st[i]<=k)   ans++;
    cout<<n-ans<<endl;

    return;
}    
   
int main()
{
    std::ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    
    int T;cin>>T;while(T--)
        solve();    


    return 0;
}