UVA 1267 Network(dfs)

来源:互联网 发布:手机制作同学录软件 编辑:程序博客网 时间:2024/06/05 02:43
先把s节点作为根节点,建立一棵树,k层以上是不用管的,把k层以下的叶子结点放到node数组中,最下面的叶子结点网上走k-1层,然后当前节点作为根,建树,重复循环直到所有的点都被覆盖为止。
////  main.cpp//  Richard////  Created by 邵金杰 on 16/9/30.//  Mail:1016427040@qq.com or jasonshaosjj@gmail.com//  Copyright © 2016年 邵金杰. All rights reserved.//#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int maxn=1000+10;vector<vector<int> > G(maxn),node(maxn);int n,s,k;int fa[maxn];int covered[maxn];void dfs1(int u,int f,int d){    fa[u]=f;    int nc=(int)G[u].size();    if(nc==1&&d>k) node[d].push_back(u);    for(int i=0;i<G[u].size();i++){        int v=G[u][i];        if(v!=f) dfs1(v,u,d+1);    }}void dfs2(int u,int f,int d){    covered[u]=1;    for(int i=0;i<G[u].size();i++){        int v=G[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--)    {        for(int i=0;i<node[d].size();i++){            int p=node[d][i];            if(covered[p]) continue;            int v=p;            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--)    {        int u,v;        scanf("%d%d%d",&n,&s,&k);        for(int i=0;i<=n;i++) G[i].clear(),node[i].clear();        for(int i=0;i<n-1;i++)        {            scanf("%d%d",&u,&v);            G[u].push_back(v);            G[v].push_back(u);        }        dfs1(s,-1,0);        printf("%d\n",solve());    }    return 0;}//2 14//12 2//1 2//2 3//3 4//4 5//5 6//7 5//8 5//4 9//10 3//2 12//12 14//13 14//14 11

0 0