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
  • 相关阅读:
    阿里云与物理服务器
    ## 100个网路基础知识##
    Linux 中vim编辑器
    Linux 目录结构及增删改查
    Linux 命令行常用快捷键
    XSS劫持cookie登录
    Tomcat
    centos 6.5 搭建DHCP实验
    centos 6.5 系统故障分析实验
    LVM的创建及管理
  • 原文地址:https://www.cnblogs.com/cyd308/p/5644893.html
Copyright © 2011-2022 走看看