给出一棵树,对于每一个叶子节点要使得在它的k距离内至少一个节点被打了标记,(叶节点不能打标记,非叶结点也不必满足这个条件),现在已经有一个节点s被打了标记,问至少还要打几个标记(这表达能力也是捉急...自己懂就算了...)
#include<iostream> #include<cstring> #include<cstdio> #include<vector> using namespace std; ; vector<int> G[maxn],/*tree[maxn],*/nodes[maxn]; int fa[maxn],cover[maxn],n,s,k; void dfs(int u,int f,int d){ fa[u]=f; ) nodes[d].push_back(u); /*else{*/ ;i<G[u].size();i++){ int go=G[u][i]; if(go!=f){ //tree[u].push_back(go); dfs(go,u,d+); } } //} } void put(int u,int f,int d){ //if(d>=k+1) return; cover[u]=; /*for(int i=0;i<tree[u].size();i++){ int go=tree[u][i]; if(d<k) put(go,u,d+1); }*/ ;i<G[u].size();i++){ int go=G[u][i]; ); } } void init(){ ;i<=n;i++) G[i].clear(),/*tree[i].clear(),*/nodes[i].clear(); } int main() { int T; scanf("%d",&T); while(T--){ scanf("%d %d %d",&n,&s,&k); init(); ;i<n;i++){ int x,y; scanf("%d %d",&x,&y); G[x].push_back(y); G[y].push_back(x); } dfs(s,-,); ; memset(cover,,sizeof(cover)); ;i>k;i--){ ;j<nodes[i].size();j++){ int r=nodes[i][j]; if(cover[r]) continue; int p=r; ;q<=k;q++) p=fa[p]; put(p,-,); ans++; } } printf("%d",ans); /*if(T)*/ printf("\n"); } ; }