LA3902 Network

来源:互联网 发布:软件维护网站安全 编辑:程序博客网 时间:2024/06/03 12:39
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <queue>using namespace std;const int maxn=1010;vector<int>gr[maxn],nodes[maxn];int n,s,k,fa[maxn];bool covered[maxn];void dfs(int u,int f,int d){fa[u]=f;//记录父节点 int nc=gr[u].size();if(nc==1&&d>k)//必须是叶子结点,并且距离s大于k(未被s覆盖){nodes[d].push_back(u);}for(int i=0;i<nc;i++){int v=gr[u][i];if(v!=f){dfs(v,u,d+1);//只覆盖到新服务器距离不超过k的节点 }}}void dfs2(int u,int f,int d){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--){for(int i=0;i<nodes[d].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);//在结点v放服务器 ans++;}}return ans;}int main(){int T;cin>>T;while(T--){cin>>n>>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;cin>>a>>b;gr[a].push_back(b);gr[b].push_back(a);}dfs(s,-1,0);cout<<solve()<<endl;}return 0;}

0 0