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 }
View Code

 

以上是关于UVALive 3902 网络的主要内容,如果未能解决你的问题,请参考以下文章

uvalive3902(树上的最优化 贪心)

LA 3902 网络

UVALive - 3487 Duopoly(网络流-最小割)

[Luogu 3902]Increasing

[Luogu 3902]Increasing

模拟赛33 T2incr(luogu p3902 递增)