UVALive 3902 网络
Posted cyd2014
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVALive 3902 网络相关的知识,希望对你有一定的参考价值。
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2515
http://7xjob4.com1.z0.glb.clouddn.com/c6a2a6f54f5a6c2cae2c82df2ec552f7
题意:给网络图,叶节点是客户端,其他是服务器,设置最少的服务数在服务器上使客户端到服务的距离不超过指定值
思路:将已有的那个服务作根,转换图至有根树,记录各叶子节点的深度;选深度最大的叶节点的 指定值距离 的父亲节点作为设置服务最划算,设置后dfs覆盖状态,只需处理深度大于指定值的叶子节点。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1005; 5 vector <int> gr[maxn],nodes[maxn]; 6 int n,s,k,fa[maxn]; 7 bool covered[maxn]; 8 9 void dfs(int u,int f,int d) 10 { 11 int i,j; 12 fa[u]=f; 13 int nc=gr[u].size(); 14 if(nc==1 && d>k) 15 { 16 nodes[d].push_back(u); 17 } 18 for(i=0;i<nc;i++) 19 { 20 int v=gr[u][i]; 21 if(v!=f) 22 dfs(v,u,d+1); 23 } 24 return ; 25 } 26 27 void dfs2(int u,int f,int d) 28 { 29 int i,j; 30 covered[u]=true; 31 int nc=gr[u].size(); 32 for(i=0;i<nc;i++) 33 { 34 int v=gr[u][i]; 35 if(v!=f && d<k) 36 dfs2(v,u,d+1); 37 } 38 return ; 39 } 40 41 int solve() 42 { 43 int ans=0; 44 int i,j; 45 memset(covered,0,sizeof(covered)); 46 for(int d=n-1;d>k;d--) 47 { 48 for(i=0;i<nodes[d].size();i++) 49 { 50 int u=nodes[d][i]; 51 if(covered[u]) continue; 52 53 int v=u; 54 for(j=0;j<k;j++) 55 v=fa[v]; 56 dfs2(v,-1,0); 57 ans++; 58 } 59 } 60 return ans; 61 } 62 63 64 int main() 65 { 66 int T; 67 int i,j; 68 scanf("%d",&T); 69 while(T--) 70 { 71 scanf("%d%d%d",&n,&s,&k); 72 for(i=0;i<=n;i++) 73 { 74 gr[i].clear(); 75 nodes[i].clear(); 76 } 77 for(i=1;i<n;i++) 78 { 79 int u,v; 80 scanf("%d %d",&u,&v); 81 gr[u].push_back(v); 82 gr[v].push_back(u); 83 } 84 dfs(s,-1,0); 85 printf("%d\\n",solve()); 86 } 87 return 0; 88 }
以上是关于UVALive 3902 网络的主要内容,如果未能解决你的问题,请参考以下文章