题意:

     给你一棵树,所有叶子节点都是客户端,其他的都是服务器,然后问你最少在多少个服务器上安装VOD能使所有的客户端都能流畅的看视频,流畅看视频的条件是每个客户端距离他最近的安装VOD的服务器的距离不能超过k,而且题目已经给你在一个服务器上安装好了VOD。

思路:

     自己没想出来,说下白书上的思路,第一个就是说当遇到无根树的时候,一般情况下把无根树变成有根数会有利于问题的解决,然后这个题目就是把给定的VOD服务器变成了树根,然后我们可以根据贪心策略,先处理深度最深的,安装VOD是在当前深度最深的上面第k个父亲那安装VOD这样是为了尽可能多的去让别的客户端能用上这个VOD,然后就是模拟这个过程了,这个思路是白书上说的,我想了一阵子,只是感觉有道理,但并不能肯定他的正确性,说白了就是还没弄清楚这样为什么是对的,以后会重新编辑这篇博客。

     

#include<stdio.h>

#include<string.h>

#define N 1000+5

#define N_node 1000 + 5

#define N_edge 2000 + 10

typedef struct

{

   int to ,next;

}STAR;

STAR E[N_edge];

int list[N_node] ,tot;

int mark[N] ,mk[N] ,deep[N];

int dis[N][N] ,mer[N];

void add(int a ,int b)

{

   E[++tot].to = b;

   E[tot].next = list[a];

   list[a] = tot;

}

//deep mark

void DFS1(int s ,int fa)

{

   int mk = 0;

   for(int k = list[s] ;k ;k = E[k].next)

   {

       int to = E[k].to;

       if(to == fa) continue;

       mk = 1;

       mer[to] = s;

       deep[to] = deep[s] + 1;

       DFS1(to ,s);

   }

   mark[s] = !mk;

}

//dis

void DFS2(int sss ,int now ,int s ,int fa)

{

    for(int k = list[s] ;k ;k = E[k].next)

    {

        int to = E[k].to;

        if(to == fa) continue;

        dis[sss][to] = now;

        DFS2(sss ,now + 1 ,to ,s);

    }

}

int main ()

{

    int n ,s ,k ,i ,j ,t ,a ,b;

    scanf("%d" ,&t);

    while(t--)

    {

        scanf("%d %d %d" ,&n ,&s ,&k);

        memset(list ,0 ,sizeof(list)) ,tot = 1;

        for(i = 1 ;i < n ;i ++)

        {

            scanf("%d %d" ,&a ,&b);

            add(a ,b) ,add(b ,a);

        }

        for(i = 1 ;i <= n ;i ++) mer[i] = i;

        deep[s] = 0;

        DFS1(s ,-1);

        for(i = 1 ;i <= n ;i ++)

        {

           dis[i][i] = 0;

           DFS2(i ,1 ,i ,-1);

        }

         

        memset(mk ,0 ,sizeof(mk));

        for(i = 1 ;i <= n ;i ++)

        if(mark[i] && dis[s][i] <= k) 

        mk[i] = 1;

        int Ans = 0;

        while(1)

        {

            int mkid = 0 ,maxdeep = 0;

            for(i = 1 ;i <= n ;i ++)

            {

                if(!mark[i] || mk[i]) continue;

                if(maxdeep < deep[i])

                maxdeep = deep[i] ,mkid = i;

            }

            if(!mkid) break;        

            Ans ++;

            int maxdis = 0 ,mknode = 0;

            mknode = mkid;

            for(i = 1 ;i <= k ;i ++)

            mknode = mer[mknode];

            for(i = 1 ;i <= n ;i ++)

            {

                if(!mark[i] || mk[i]) continue;

                if(dis[mknode][i] <= k) mk[i] = 1;

            }

        }

        printf("%d\n" ,Ans);

    }

    return 0;

}    

        

           

            

        

LA3902网络的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  3. 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法

    如果你正在构建一个基于 gulp 的前端自动化开发环境,那么极有可能会用到 gulp-sass ,由于网络原因你可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件.本文主要讨论在不变更 ...

  4. Virtual Box配置CentOS7网络(图文教程)

    之前很多次安装CentOS7虚拟机,每次配置网络在网上找教程,今天总结一下,全图文配置,方便以后查看. Virtual Box可选的网络接入方式包括: NAT 网络地址转换模式(NAT,Network ...

  5. 前端网络、JavaScript优化以及开发小技巧

    一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...

  6. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  7. C# 利用性能计数器监控网络状态

    本例是利用C#中的性能计数器(PerformanceCounter)监控网络的状态.并能够直观的展现出来 涉及到的知识点: PerformanceCounter,表示 Windows NT 性能计数器 ...

  8. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  9. [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化

    KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...

随机推荐

  1. HDOJ-1257(贪心/动态规划)

    最少拦截系统 HDOJ-1257 我做这题的思路就是采用暴力或者贪心.也就是每次循环选出从第一个未被选择的元素开始,依次把后面可以选择的元素作为一个系统.最后统计可以有多少个系统. 还有人的思路就是利 ...

  2. JavaScript初级学习

    1. JavaScript的介绍 前身是LiveScript+JavaScript JavaScript(js)是一个脚本语言 基于浏览器的脚本语言 基于对象,面向对象的一个编程语言 2. EcmaS ...

  3. 漏洞复现-CVE-2017-12629-RCE-solr:XXE

                  0x00 实验环境 攻击机:Win 10.Win Server 2012 R2 靶机:Ubuntu18 (docker搭建的vulhub靶场) 0x01 影响版本 Apac ...

  4. Educational Codeforces Round 98 (Rated for Div. 2)

    A 如果\(n = m\),答案为\(2 \times n\):如果\(n \ne m\),答案为\(2 \times max(n,m) - 1\) #include <bits/stdc++. ...

  5. LNMP配置——Nginx配置 —— 用户认证

    一.配置 再来创建一个新的虚拟主机 #cd /usr/local/nginx/conf/vhost #vi test.com.conf 写入: server { listen 80; server_n ...

  6. 1 [main] DEBUG Sigar - no sigar-amd64-winnt.dll in java.library.path org.hyperic.sigar.SigarException: no sigar-amd64-winnt.dll in java.library.path

    github上一个java项目,在myeclipse中运行正常,生成jar后,运行报错: 1 [main] DEBUG Sigar - no sigar-amd64-winnt.dll in java ...

  7. Spark中普通集合与RDD算子的sortBy()有什么区别

    分别观察一下集合与算子的sortBy()的参数列表 普通集合的sortBy() RDD算子的sortBy() 结论:普通集合的sortBy就没有false参数,也就是说只能默认的升序排. 如果需要对普 ...

  8. 使用 Android Studio 的日志工具 Log

    •Log简介 Android中的日志工具类是Log,这个类中提供了5个方法来供我们打印日志: 1. $Log.v()$ 用于打印那些最为琐碎的,意义最小的日志信息 对应级别 verbose,是 And ...

  9. 分享15个实用VSCode插件,快来收藏吧!

    Visual Studio Code 是由微软开发的一款免费.跨平台的文本编辑器.它有卓越的性能和丰富的功能.VSCode 也有一个扩展和主题市场,为了帮助大家挑选出值得下载的插件,我们针对性的收集了 ...

  10. Kubernetes使用metric-server让HPA弹性伸缩运行

    监控架构概述 kubernetes监控指标大体可以分为两类:核心监控指标和自定义指标,核心监控指标是kubernetes内置稳定可靠监控指标,早期由heapster完成,现由metric-server ...