Codeforces Round #748 (Div. 3) E

E. Gardener and Tree

显然我们对于每一个叶节点是度数为1的
我们如果删除外层叶节点的时候
显然也要改变与他与他连接的节点的度数
而只有可以能在这些节点里诞生新的叶节点 注意也可能不会诞生
所以对于每一次我们一层一层的去bfs就可以了
当然我们要特判n==1的情况

#include <bits/stdc++.h>
using namespace std;
const int N = 4e5+10;
const int M = 998244353;
const int mod = 20220911;
#define int long long
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int n,k,d[N];
vector<int>g[N];
void solve() {
    cin>>n>>k;
    for(int i=1;i<=n;i++)g[i].clear(),d[i]=0;
    for(int i=1;i<n;i++){
        int u,v;cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
        d[u]++,d[v]++;
    }
    if(n==1){cout<<0<<endl;return;}
    vector<int>q;
    for(int i=1;i<=n;i++)if(d[i]==1)q.push_back(i);
    int cnt=q.size();
    int c=1;
    if(c==k){cout<<n-cnt<<endl;return;}
    while(q.size()){
        vector<int>nxt;
        for(auto u:q)
            for(auto v:g[u]){
                d[v]--;
                if(d[v]==1)nxt.push_back(v);
            }
        q=nxt;
        cnt+=q.size();
        c++;
        if(c==k){cout<<n-cnt<<endl;return;}
    }
    cout<<0<<endl;
}
signed main(){
    fast
    int t;t=1;cin>>t;
    while(t--) {
        solve();
    }
    return ~~(0^_^0);
}
posted @ 2022-10-16 21:39  ycllz  阅读(18)  评论(0)    收藏  举报