HDU 6228 Tree
阿新 • • 發佈:2018-12-12
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <string> #include <vector> #include <bitset> #include <stack> #include <cmath> #include <deque> #include <queue> #include <list> #include <set> #include <map> #define mem(a, b) memset(a, b, sizeof(a)) #define pi acos(-1) using namespace std; typedef long long ll; const int inf = 0x3f3f3f3f; const int maxn = 200000+5; struct Ed{ int u, v; }ed[200000+5]; int du[maxn], p[maxn]; vector<int> v[maxn]; queue<int> q; int main(){ int t; scanf("%d", &t); while(t--){ int n, k; scanf("%d %d", &n, &k); for(int i = 1; i <= n; i++){ v[i].clear(); p[i] = 1; du[i] = 0; } for(int i = 1; i <= n-1; i++){ scanf("%d %d", &ed[i].u, &ed[i].v); v[ed[i].u].push_back(ed[i].v); v[ed[i].v].push_back(ed[i].u); du[ed[i].u]++; du[ed[i].v]++; } if(k == 0){ printf("0\n"); continue; } for(int i = 1; i <= n; i++){ if(du[i] == 1){ q.push(i); du[i]--; } } while(!q.empty()){ int temp = q.front(); q.pop(); for(int i = 0; i < v[temp].size(); i++){ if(du[v[temp][i]]){ du[v[temp][i]]--; if(du[v[temp][i]] == 1){ q.push(v[temp][i]); du[v[temp][i]]--; } p[v[temp][i]] += p[temp]; } } } int ans = 0; for(int i = 1; i <= n-1; i++){ if(p[ed[i].u] >= k && p[ed[i].v] >= k){ ans++; } } printf("%d\n", ans); } }