北极通讯网络题解(做题记录)

news/2025/9/27 11:26:48/文章来源:https://www.cnblogs.com/blacksunrise/p/19114875

北极通讯网络题解(做题记录)

前言

本文以一道 Kruskal 的好题实例来讲一下 Kruskal 的过程,对于初学 Kruskal 的OIer们有很大的帮助。

luogu 相似题:P1991 无线通讯网。

题目简述

有 n 座村庄,每座村庄的坐标用一对整数 (x,y) 表示。通讯工具分为卫星设备和无线电收发机。

无线电收发机之间通讯的费用为 d ,拥有卫星设备的两座村庄无论相距多远都可以直接通讯。

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

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

其中 |AB|= 10, |BC|= 20, |AC|= 10 * sqrt{5}≈22.36

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

数据范围

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

思路

PART.1 「显而易见」

显而易见的,本题如果没有卫星设备的话,最小的$d$值就是在刚好保证所有村庄均可以直接或者间接联系的情况下,长度最长的那一条。

注意刚才的内容为“需要「刚好」保证所有村庄均可以直接或者间接联系”,「刚好」可以翻译为,既可以保证村庄之间可以直接或者间接联系的同时还能使每两个村庄之间直接连接的边都尽量的小。那么显然地可以使用 Kruskal 求最小生成树,因为 Kruskal 是对边进行排序,所以绝对能选到边权小的边。


(优美的PART分割线)

PART.2 「算法详解」

Kruskal 算法求的是最小生成树问题。具体操作方式就是,首先对于所有的边进行排序,然后将所有的点分为两类,一类是没有被加入最小生成树的,另一类是已经加入这个最小生成树的。按边权升序进行添加边,并添加对应的点,然后使用并查集统计所有已添加点的状态,当所有的点都被加入这个图之后算法就完成了。如果没有听懂的话点击这里。

PART.3 「基于上面」

基于上面的方法,接下来,再考虑使用 k 个卫星设备的情况,明显地,使用 k 个卫星设备的情况只需要考虑链接 n-k 条边形成的最小生成树,因为对于 n-k 条边,明显可以连接 n-k+1 个点,这样的话,就能保证这个最小生成树内有一台卫星通讯设备,就能与剩下的 k-1 个点使用卫星通讯了。

很显然,我们需要所有的边尽量的小。所以只需要顺着 Kruskal 的正常思路跑一遍,但是只需要跑出 n-k 条边即可。


PART.4 「总而言之」

总而言之,这道题的思路就是 Kruskal 求最小生成树,然后需要加一些预处理,对于每两个点的之间的距离进行计算,直接处理欧拉距离即可。

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=505;
int n,k;
int a[N],b[N];
struct node{int s,e;double leng;
}path[210000];//存储两个点之间的边
int len;
int father[N];double dis(int x,int y){return sqrt((double)(a[x]-a[y])*(a[x]-a[y])+(b[x]-b[y])*(b[x]-b[y]));
}//求两点之间的欧拉距离bool cmp(node x,node y){return x.leng<y.leng;
}/*----------Kruskal----------*/int finding(int i){if(father[i]==i){return i;}father[i]=finding(father[i]);return father[i];
}//寻找最大的祖先bool connect(int st,int ed){int fs=finding(st),fe=finding(ed);if(fs==fe){return false;}father[fs]=fe;return true;
}//在st和ed的最大祖先之间连边void kruskal(){sort(path+1,path+len+1,cmp);//对边排序for(int i=1;i<=n;i++){father[i]=i;}//初始化int cnt=0;for(int i=1;i<=len;i++){if(connect(path[i].s,path[i].e)){cnt++;//如果是刚刚连上的边就证明多通了一个点if(cnt==n-k){  //通了所有的n-k个点就完成了printf("%.2f",path[i].leng);return ;}}}return ;
}/*---------------------------*/int main(){cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i]>>b[i];}for(int i=1;i<n;i++){for(int j=i+1;j<=n;j++){len++;path[len]={i,j,dis(i,j)};}}//枚举任意两个点,建边kruskal();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/919398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在局域网中做网站wordpress怎样发布时间

SpringMVC 的入门 1环境搭建 1.1.创建工程 1.2.添加web支持 右键项目选择Add framework support... 2.添加web支持 ​ 3.效果 注意&#xff1a; 不要先添加打包方式将web目录要拖拽到main目录下&#xff0c;并改名为webapp 1.3.pom.xml <?xml version"1.0&q…

elasticsearch安装插件 - 实践

elasticsearch安装插件 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

个人学习——前端react项目框架

文件作用 package.json npm脚本部分"scripts" 项目启动与打包"dev": "vite" 启动 开发环境,开启本地服务器,支持热更新。 用法:npm run dev "build": "tsc &&…

软件基础第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/25rjjc这个作业的目标 对自我进行分析和评估,了解博客使用方法,说明对课程的想法姓名-学号 林子渊 2023333503079自我介绍: 我叫林子渊,来自 23 自动化…

网站建设7个基本流程分析统一门户登录

一、简述 这里的代码主要是基于图像的推荐系统,该系统利用 ResNet-50 深度学习模型作为特征提取器,并采用余弦相似度来查找给定输入图像的最相似嵌入。 该系统旨在根据所提供图像的视觉内容为用户提供个性化推荐。 二、所需环境 Python 3.x tensorflow ==2.5.0 numpy==1.21.…

.net商城网站模板下载宁乡电商网站建设收费

title: URL编码&#xff1a;原理、应用与安全性 date: 2024/3/29 18:32:42 updated: 2024/3/29 18:32:42 tags: URL编码百分号编码特殊字符处理网络安全应用场景标准演变未来发展 在网络世界中&#xff0c;URL&#xff08;统一资源定位符&#xff09;是我们访问网页、发送请求…

LGP9755 [CSP-S 2023] 种树 学习笔记

LGP9755 [CSP-S 2023] 种树 学习笔记 Luogu Link 前言 故地重游。 巧合的是,上次写这道题刚好是在去年的九月二十七日,整整一年前。 题意简述 给定一个 \(n\) 个点,\(n-1\) 条边的简单无向连通图。好吧,这片地本身…

7、revision 是 Maven 3.5+ 引入的现代版本管理机制 - 实践

7、revision 是 Maven 3.5+ 引入的现代版本管理机制 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

P1731 生日蛋糕 做题记录

洛谷P1731 生日蛋糕 做题记录 题意简述 一个生日蛋糕由几个圆柱体组成,每个圆柱体的底面半径和高从下到上严格递减,现给出蛋糕的体积 N pi 以及层数 M,试求蛋糕的最小表面积。 思路速通 基本为 DFS ,对于每层的半径…

详细介绍:【MySQL】MySQL数据库入门指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

如何有效提升代码覆盖率:从单元测试到集成测试的实践指南

Go语言代码覆盖率实现 一、什么是代码覆盖率代码覆盖率是软件测试中的一种白盒测试度量指标,表示程序源代码中被执行的比例。简单来说,就是“我的测试到底跑过多少代码”。 覆盖率常见的几种标准:语句覆盖(段覆盖、…

深入解析:SSM网络游戏交易系统a9n72(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面

深入解析:SSM网络游戏交易系统a9n72(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto …

Spring知识点(2)

一、有哪些依赖注入方式?构造方法注入:通过调用类的构造方法,推荐用于强依赖(没有依赖对象就没法工作)。这也是官方推荐的注入方式。好处:依赖不可变(final修饰)、更安全。@Component public class UserServic…

成都电子商务网站建设非寻服饰网站建设规划书

文章目录 “预训练微调大模型”的模式以提示/指令模式直接使用大模型“预训练微调大模型”模式和Prompt/Instruct模式的异同小结 “预训练微调大模型”的模式 经过预训练的大模型所习得的语义信息和所蕴含的语言知识&#xff0c;很容易向下游任务迁移。NLP应用人员可以根据自己…

超越实习期的AI自动化工具:播客工作流与Slack导出器实战

本文详细介绍实习期间基于Claude AI模型开发的两个自动化工具:播客工作流年省1250小时人工,Slack导出器实现智能知识检索。包含技术架构、问题解决方案和实际应用效果,展现AI如何增强企业工作效率。超越实习期的实习…

调度器的各项指标以及计算方式

CPU利用率 \[利用率=\frac{忙碌的时间}{总时间} \]系统吞吐量 单位时间内完成作业的数量 \[系统吞吐量=\frac{总共完成了多少道作业}{总共花了多少时间} \]周转时间 1.周转时间-平均周转时间\[作业周转时间=作业完成时…

​CentOS 7 安装 net-tools.rpm 包步骤详解(附 rpm 命令和 yum 方法)​附安装包

​CentOS 7 安装 net-tools.rpm 包步骤详解(附 rpm 命令和 yum 方法)​附安装包​一、先确认你的系统是 CentOS 7 或 RHEL 7 这个包是专门给 ​CentOS 7​ 或者 ​RHEL 7​(也就是 64 位系统)用的,文件名里的 el7…

青原区城乡建设局门户网站网站建设的系统简介

Kibana是一个开源的分析与可视化平台&#xff0c;设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。是es的可视化客户端之一。 一&#xff1a;下载 https://www.elastic.co/cn/kibana 我的es是elasticsearch-7.10.2版本&#x…

深入解析:【Linux】UDP 网络编程

深入解析:【Linux】UDP 网络编程2025-09-27 11:02 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impor…

浅谈dsu on tree

前言 先学树剖。 讲讲启发式合并,最经典的就是并查集的按秩合并,这里不细讲。 常用的启发式合并就是小集合合并到大集合上,复杂度从 \(O(n^2)\) 优化至 \(O(n \log n)\)。 例题 P3201 [HNOI2009] 梦幻布丁 题目描述…