UVALive 3902 網絡

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2515php

http://7xjob4.com1.z0.glb.clouddn.com/c6a2a6f54f5a6c2cae2c82df2ec552f7node

 

題意:給網絡圖,葉節點是客戶端,其餘是服務器,設置最少的服務數在服務器上使客戶端到服務的距離不超過指定值c++

思路:將已有的那個服務做根,轉換圖至有根樹,記錄各葉子節點的深度;選深度最大的葉節點的 指定值距離 的父親節點做爲設置服務最划算,設置後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
相關文章
相關標籤/搜索