LA3902 Network

给出一棵树,对于每一个叶子节点要使得在它的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");
     }
     ;
 }
上一篇:Socket网络通信基础


下一篇:Git权威指南学习笔记(二)Git暂存区