zoukankan      html  css  js  c++  java
  • 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
    ",solve());
    86     }
    87     return 0;
    88 }
    View Code
  • 相关阅读:
    十张伟大的科学瞬间
    机器学习如何破译早已消亡的古老语言?
    如何阻止「数码黑帮」偷走你的时间
    社会地位即服务, Status as a Service (二): 社交网络的投资回报率 (ROI)
    谁是你的创业竞争对手?
    酷!美国国家安全局(NSA)开源了逆向工程工具 Ghidra
    Linux终端下Ctrl+S卡死
    操作系统损坏重装是否能恢复lvm硬盘数据的相关实验
    How to write an iso file to usb driver
    linux screen的用法
  • 原文地址:https://www.cnblogs.com/cyd308/p/5644893.html
Copyright © 2011-2022 走看看