题目链接:https://loj.ac/problem/10065

题目描述

原题来自:Waterloo University 2002

北极的某区域共有 nnn 座村庄,每座村庄的坐标用一对整数 (x,yx, yx,y) 表示。为了加强联系,决定在村庄之间建立通讯网络。通讯工具可以是无线电收发机,也可以是卫星设备。所有的村庄都可以拥有一部无线电收发机, 且所有的无线电收发机型号相同。但卫星设备数量有限,只能给一部分村庄配备卫星设备。

不同型号的无线电收发机有一个不同的参数 ddd,两座村庄之间的距离如果不超过 ddd 就可以用该型号的无线电收发机直接通讯,ddd 值越大的型号价格越贵。拥有卫星设备的两座村庄无论相距多远都可以直接通讯。

现在有 kkk 台卫星设备,请你编一个程序,计算出应该如何分配这 kkk 台卫星设备,才能使所拥有的无线电收发机的 ddd 值最小,并保证每两座村庄之间都可以直接或间接地通讯。

例如,对于下面三座村庄:

其中 |AB|=10,|BC|=20,|AC|=10√5≈22.36

如果没有任何卫星设备或只有 111 台卫星设备 (k=0k=0k=0 或 k=1k=1k=1),则满足条件的最小的 d=20d = 20d=20,因为 AAA 和 BBB,BBB 和 CCC 可以用无线电直接通讯;而 AAA 和 CCC 可以用 BBB 中转实现间接通讯 (即消息从 AAA 传到 BBB,再从 BBB 传到 CCC);

如果有 222 台卫星设备 (k=2k=2k=2),则可以把这两台设备分别分配给 BBB 和 CCC ,这样最小的 ddd 可取 101010,因为 AAA 和 BBB 之间可以用无线电直接通讯;BBB 和 CCC 之间可以用卫星直接通讯;AAA 和 CCC 可以用 BBB 中转实现间接通讯。

如果有 333 台卫星设备,则 A,B,CA,B,CA,B,C 两两之间都可以直接用卫星通讯,最小的 ddd 可取 000。

输入格式

第一行为由空格隔开的两个整数 n,kn,kn,k;

第 2∼n+12\sim n+12∼n+1 行,每行两个整数,第 iii 行的 xi,yix_i,y_ix​i​​,y​i​​ 表示第 iii 座村庄的坐标 (xi,yix_i, y_ix​i​​,y​i​​)。

输出格式

一个实数,表示最小的 ddd 值,结果保留 222 位小数。

样例

样例输入

3 2
10 10
10 0
30 0

样例输出

10.00

数据范围与提示

对于全部数据,1≤n≤500,0≤x,y≤104,0≤k≤1001\le n\le 500, 0\le x, y\le 10^4, 0\le k\le 1001≤n≤500,0≤x,y≤10​4​​,0≤k≤100。

题解:

自己做这道题的时候,YY了一个跟正解一样的思路,但却不知道怎么证。

后来到网上找了找,发现了一篇很好的证明。

当然,只要证出来了,代码就很简单了。

证明如下:

当正向思考受阻时,逆向思维可能有奇效。本题就是这样。知道卫星设备的数量,求最小的收发距离,可能比较困难;如果知道距离求数量,就很简单了。把所有可以互相通讯的村庄连接起来,构成一个图。卫星设备的台数就是图的连通支的个数。

问题转化为:找到一个最小的d,使得把所有权值大于d的边去掉之后,连通支的个数小于等于k。

先看一个定理。定理2:如果去掉所有权值大于d的边后,最小生成树被分割成为k个连通支,图也被分割成为k个连通支。

证明:用反证法。假设原图被分割成k’ (k'≠k)个连通支,显然不可能k’>k,所以k’<k。因此在某一图的连通支中,最小生成树被分成了至少两部分,不妨设其为T1,T2。因为T1和T2同属于一个连通支,所以一定存在x∈T1,y∈T2,w(x,y)≤d。又因为在整个最小生成树中,所以x到y的路径中一定存在一条权值大于d的边(u,v)(否则x和y就不会分属于T1和T2了),w(x,y)≤d<w(u,v),所以把(x,y)加入,把(u,v)去掉,将得到一棵总权值比最小生成树还小的生成树。这显然是不可能的。所以,原命题成立。(证毕)

有了这个定理,很容易得到一个构造算法:最小生成树的第k长边就是问题的解。

首先,d取最小生成树中第k长的边是可行的。如果d取第k长的边,我们将去掉最小生成树中前k-1长的边,最小生成树将被分割成为k部分。由定理2,原图也将分割成为k部分。(可行性)

其次,如果d比最小生成树中第k长的边小的话,最小生成树至少被分割成为k+1部分,原图也至少被分割成为k+1部分。与题意不符。(最优性)

综上所述,最小生成树中第k长的边是使得连通支个数≤k的最小的d,即问题的解。

代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,k,x[],y[],d[];
bool vis[];
int cc(int i,int j){return(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);}
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
{
scanf("%d%d",&x[i],&y[i]);
d[i]=cc(,i);
}
for(int i=;i<n;i++)
{
int mi=2e9,k;
for(int j=;j<=n;++j)if(!vis[j]&&d[j]<mi)mi=d[k=j];
vis[k]=;
for(int j=;j<=n;++j)if(!vis[j])d[j]=std::min(d[j],cc(k,j));
}
std::sort(d+,d++n);
printf("%.2lf\n",sqrt(d[n-k+]));
return ;
}

谢谢大家!

LOJ#10065. 「一本通 3.1 例 2」北极通讯网络的更多相关文章

  1. LOJ#10064. 「一本通 3.1 例 1」黑暗城堡

    LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...

  2. LOJ #10131 「一本通 4.4 例 2」暗的连锁

    LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...

  3. Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)

    题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...

  4. LOJ#10106. 「一本通 3.7 例 2」单词游戏

    题目链接:https://loj.ac/problem/10106 题目描述 来自 ICPC CERC 1999/2000,有改动. 有 NNN 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词. ...

  5. LOJ #10132. 「一本通 4.4 例 3」异象石

    题目地址 LOJ 题解 神仙思路.思路参考自<算法竞赛进阶指南>. 考虑维护dfs序中相邻两个石头的距离,那么每次?的答案就是sum/2(首尾算相邻) 然后维护一下拿个平衡树/set维护一 ...

  6. LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci

    题目链接 题目大意 $$F[i]=F[i-1]+F[i-2]\ (\ F[1]=1\ ,\ F[2]=1\ )$$ $$T[i]=F[1]+2F[2]+3F[3]+...+nF[n]$$ 求$T[n] ...

  7. LOJ 10138 -「一本通 4.5 例 1」树的统计

    树链剖分模板题,详见这篇博客.

  8. LOJ 10155 - 「一本通 5.2 例 3」数字转换

    前言 从现在开始,这个博客要写一些题解了.起初,开这个博客只是好玩一样,没事就写写CSS.JS,然后把博客前端搞成了现在这个样子.以前博客只是偶尔记录一些东西,刷题也从来不记录,最近受一些学长的影响, ...

  9. loj #10001. 「一本通 1.1 例 2」种树

    题面 解题思路 贪心,首先按右端点排序,然后从小往大扫,因为要求树最少,所以要尽量放在右端点.然后开个bool数组判断是否种过树即可. 代码 #include<iostream> #inc ...

随机推荐

  1. Composer安装使用

    Composer 是 PHP5.3以上 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们. 1.下载 2.安装成功 3.配置地址 4.安装代码库 镜像 配置json

  2. Rest之路 - 第一个Rest程序

    在 Eclipse 里新建一个 Dynamic project 将 Jersey 的 jar 包,拷贝到 WebContent -> WEB-INF -> lib 文件夹 Add jars ...

  3. Oracle 复杂查询(1)

    一.复杂查询 1. 列出至少有一个员工的所有部门编号.名称,并统计出这些部门的平均工资.最低工资.最高工资. 1.确定所需要的数据表: emp表:可以查询出员工的数量: dept表:部门名称: emp ...

  4. SQL Server 2008怎么自动备份数据库

    在SQL Server 2008数据库中.为了防止数据的丢失我们就需要按时的来备份数据库了.要是每天都要备份的话,人工备份会很麻烦的,自动备份的话就不需要那么麻烦了,只 要设置好了,数据库就会自动在你 ...

  5. 什么是AJAX?AJAX的原理

    AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML)通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重 ...

  6. 教你实现GPUImage - OpenGL渲染原理<转>

    http://www.open-open.com/lib/view/open1483943550976.html

  7. c作图-正弦函数图像

    #include<graphics.h>#include<math.h>int main(){    int gmode,gdriver=DETECT; double x1,y ...

  8. axis1.4 发布webservice的问题

    用axis1.4 发布webservice的问题 The service class "org.gdt.sgcda.wf.impl.DefinitionManageServiceImpl&q ...

  9. 让IE10等支持classList2.0

    chrome24+, firesfox26+起支持classList2.0,即让它同时添加或删除多个类名, toggle方法支持第2个参数,用于强制添加或删除 var div = document.c ...

  10. 2009-2010网络最热的&nbsp;嵌入式…

    前段时间做了一个关于ARM9 2440资料的汇总帖,很高兴看到21ic和CSDN等论坛朋友们的支持和鼓励.当年学单片机的时候datasheet和学习资料基本都是在论坛上找到的,也遇到很多好心的高手朋友 ...