3902 - Network (LA)

时间:2025-02-25 21:13:48
#include <iostream> #include <cstdio> #include <vector> #include <algorithm> #include <cstring> using namespace std; const int maxn = 1000 + 10; vector<int> gr[maxn], nodes[maxn]; int n, s, k, fa[maxn]; bool covered[maxn]; void dfs(int current, int father, int depth) { fa[current] = father; int Size = gr[current].size(); if(Size == 1 && depth > k) nodes[depth].push_back(current); for(int i = 0; i < Size; i++) { int v = gr[current][i]; if(v != father) dfs(v, current, depth+1); } } void dfs2(int u, int f, int d) { if(!covered[u]) covered[u] = true; int nc = gr[u].size(); for(int i = 0; i < nc; i++) { int v = gr[u][i]; if(v != f && d < k) dfs2(v, u, d+1); } } int solve() { int ans = 0; memset(covered, 0, sizeof(covered)); for(int d = n-1; d > k; d--) { int Size = nodes[d].size(); for(int i = 0; i < Size; i++) { int u = nodes[d][i]; if(covered[u]) continue; int v = u; for(int j = 0; j < k; j++) v = fa[v]; dfs2(v, -1, 0); ans++; } } return ans; } int main() { int T; scanf("%d", &T); while(T--) { scanf("%d", &n); scanf("%d%d", &s, &k); for(int i = 1; i <= n; i++) { gr[i].clear(); nodes[i].clear();} for(int i = 0; i < n-1; i++) { int a, b; scanf("%d%d", &a, &b); gr[a].push_back(b); gr[b].push_back(a); } dfs(s, -1, 0); int res = solve(); printf("%d\n", res); } return 0; }