【图论】1 (最小生成树虚拟点思想)C.戴森球计划 题解

一. 题目

题目描述

题目描述

输入输出格式

输入输出格式

样例

样例1

样例1

样例2 & 样例解释

样例2 & 样例解释

数据范围

数据范围

二. 思路

对于前20%数据 解法

因为保证了 x i = 1 x_i = 1 xi=1,也就是说这些点都在 x = 1 x = 1 x=1 这条直线上。

那么最优解必定是在 c i c_i ci 最小的点上建发电站,然后把这些点之间全部联通即可。

即最终答案 a n s = min ⁡ 1 ≤ i ≤ n c i + max ⁡ 1 ≤ i ≤ n y i − min ⁡ 1 ≤ i ≤ n y i ans = \min_{1 \leq i \leq n}c_i + \max_{1 \leq i \leq n}y_i - \min_{1 \leq i \leq n} y_i ans=1inminci+1inmaxyi1inminyi

可见,我们要枚举 1 1 1 n n n ,所以时间复杂度为 O ( n ) O(n) O(n)

对于前70%数据 解法

思路分析

因为50%的数据没有什么特殊的地方(至少作者没有想到),所以直接从70%的数据入手。

思考: k i = 1 k_i = 1 ki=1 ,也就是点之间的连线每条边的单位花费为 1 + 1 = 2 1+1=2 1+1=2 ,而 1 0 8 ≤ c i ≤ 1 0 9 10^8 \leq c_i \leq 10^9 108ci109 很大,并且在 n ≤ 2000 n \leq 2000 n2000 的情况下,我们发现连线的花费往往小于构建发电站的花费。所以容易得出贪心策略 c i c_i ci 最小的点建发电站,其他点都与这个点联通

这个问题就等价于要把图上的每一个点都联通,并且花费最小

先考虑如何联通每一个点:构建一棵树,共有 n n n 个点和 n − 1 n-1 n1 条边。

其次要让花费小:这不就是最小生成树吗?!

具体实现

我们先把 n n n 个点之间两两连线,每条边的权值为该边的花费,构建一个完全图,然后对这张图 跑Kruskal或Prim(最小生成树) 即可。

对于100%数据 解法

发现100%的数据与70%的数据对比, k i k_i ki c i c_i ci 的取值范围更广泛,所以不一定只有一个发电站是最优解

那么按照70%数据的思路,我们对于每一个发电站,都会构建出一棵最小生成树,但一棵不一定涵盖所有点。即这张图变成了一个最小生成树组成的森林

这样的话,我们没法枚举每个发电站再构建最小生成树。能不能把这些树合在一起呢?

这里,我们引入 “虚拟点思想”,也叫做 “超级零点” 。也就是新增0号(或不在范围内的)点,并把它向其他点都连一条边,边的权值为在与其相连的点构建发电站的花费

这样,我们就可以对这个图跑最小生成树即可。因为最小生成树一定会连向虚拟点,所以至少会构建一个发电站,思路可行。

三. 代码实现

20pts 解法

#include <bits/stdc++.h>
using namespace std;
const int N = 2055;
long long id,n,k[N],x[N],y[N],maxx,minn=1e17,ress=1e17;
long long c[N],f[N],res = 1e17,ans = 0,cnt;
struct node
{long long u,v,w;
}a[N*N*2];
int main()
{freopen("electricity.in","r",stdin);freopen("electricity.out","w",stdout);cin >> id;cin >> n;for (int i=1;i<=n;i++){scanf("%lld%lld",&x[i],&y[i]);}for (int i=1;i<=n;i++){scanf("%lld",&c[i]);}for (int i=1;i<=n;i++){scanf("%lld",&k[i]);}if (1 <= id && id <= 4){for (int i=1;i<=n;i++){maxx = max(maxx,y[i]);minn = min(minn,y[i]);ress = min(ress,c[i]);}cout<<(maxx-minn)*2+ress;return 0;}return 0;
}

70pts 解法

#include <bits/stdc++.h>
using namespace std;
const int N = 2005;
long long id,n,k[N],x[N],y[N],maxx,minn=1e17,ress=1e17;
long long c[N],f[N],res = 1e17,ans = 1e17,cnt;
struct node
{long long u,v,w;
}a[N*N];
long long zabs(long long s)
{if (s > 0) return s;return -s;
}
long long dis(long long a,long long b)
{return zabs(x[a]-x[b])+zabs(y[a]-y[b]);
}
void add(long long h,long long b,long long c)
{a[++cnt].u = h;a[cnt].v = b;a[cnt].w = c;
}
bool cmp(node x,node y)
{return x.w < y.w;
}
long long fnd(int x)
{if (x == f[x]) return x;return f[x] = fnd(f[x]);
}
int main()
{freopen("electricity.in","r",stdin);freopen("electricity.out","w",stdout);cin >> id;cin >> n;for (int i=1;i<=n;i++){scanf("%lld%lld",&x[i],&y[i]);}for (int i=1;i<=n;i++){scanf("%lld",&c[i]);}for (int i=1;i<=n;i++){scanf("%lld",&k[i]);}ans = 1e17;for (int i=1;i<=n;i++){ans = mins(ans,c[i]);}for (int i=1;i<n;i++){for (int j=i+1;j<=n;j++){add(j,i,dis(i,j)*(k[i]+k[j]));add(i,j,dis(i,j)*(k[i]+k[j]));}}sort(a+1,a+cnt+1,cmp);long long tot = 0;for (int j=1;j<=n;j++){f[j] = j;}for (int j=1;j<=cnt;j++){long long p1 = fnd(f[a[j].u]);long long p2 = fnd(f[a[j].v]);if (f[p1] == f[p2]) continue;f[p1] = fnd(f[p2]);ans += a[j].w;tot++;if (tot+1 == n) break;}cout<<ans;return 0;
}

100pts 解法

#include <bits/stdc++.h>
using namespace std;
const int N = 2055;
long long id,n,k[N],x[N],y[N],maxx,minn=1e17,ress=1e17;
long long c[N],f[N],res = 1e17,ans = 0,cnt;
struct node
{long long u,v,w;
}a[N*N*2];
long long zabs(long long s)
{if (s > 0) return s;return -s;
}
long long dis(long long a,long long b)
{return zabs(x[a]-x[b])+zabs(y[a]-y[b]);
}
void add(long long h,long long b,long long c)
{a[++cnt].u = h;a[cnt].v = b;a[cnt].w = c;
}
bool cmp(node x,node y)
{return x.w < y.w;
}
long long fnd(int x)
{if (x == f[x]) return x;return f[x] = fnd(f[x]);
}
int main()
{freopen("electricity.in","r",stdin);freopen("electricity.out","w",stdout);cin >> id;cin >> n;for (int i=1;i<=n;i++){scanf("%lld%lld",&x[i],&y[i]);}for (int i=1;i<=n;i++){scanf("%lld",&c[i]);}for (int i=1;i<=n;i++){scanf("%lld",&k[i]);}ans = 0;//构图for (int i=1;i<n;i++){for (int j=i+1;j<=n;j++){add(j,i,dis(i,j)*(k[i]+k[j]));add(i,j,dis(i,j)*(k[i]+k[j]));}}//虚拟点构建for (int i=1;i<=n;i++){add(n+1,i,c[i]);add(i,n+1,c[i]);}sort(a+1,a+cnt+1,cmp);long long tot = 0;for (int j=1;j<=n+1;j++){f[j] = j;}//Kruskal最小生成树for (int j=1;j<=cnt;j++){long long p1 = fnd(f[a[j].u]);long long p2 = fnd(f[a[j].v]);if (f[p1] == f[p2]) continue;f[p1] = fnd(f[p2]);ans += a[j].w;tot++;if (tot == n) break;}cout<<ans;return 0;
}

四. 总结

这道图论题在CSP-J模拟赛放了T3,感觉略难(最小生成树和虚拟点思想略有超纲),但不引进“虚拟点思想”的70分给的很足。总体来说是一道练习最小生成树和虚拟点思想的好题。

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

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

相关文章

4.人员管理模块(开始预备工作)——帝可得管理系统

目录 前言一、需求分析1.页面原型2.创建SQL 二、使用若依框架生成前后端代码1.添加目录菜单2.添加数据字典3.配置代码生成信息4.下载代码并导入项目5.快速导入方法 三、 总结 前言 提示&#xff1a;本篇讲解人员管理模块的开发的预备工作&#xff0c;包括需求分析、生成代码、…

uniapp+Android面向网络学习的时间管理工具软件 微信小程序

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户功能…

最新版本SkyWalking【10.1.0】部署

这里写目录标题 前言前置条件启动Skywalking下载解压启动说明 集成Skywalking Agent下载Agent在IDEA中添加agent启动应用并访问SpringBoot接口 说明 前言 基于当前最新版10.1.0搭建skywalking 前置条件 装有JDK11版本的环境了解SpringBoot相关知识 启动Skywalking 下载 地…

golang grpc进阶

protobuf 官方文档 基本数据类型 .proto TypeNotesGo Typedoublefloat64floatfloat32int32使用变长编码&#xff0c;对于负值的效率很低&#xff0c;如果你的域有可能有负值&#xff0c;请使用sint64替代int32uint32使用变长编码uint32uint64使用变长编码uint64sint32使用变长…

Linux:无法为立即文档创建临时文件: 设备上没有空间

虚拟机磁盘空间不足解决记录 1、问题描述2、问题解决 1、问题描述 在命令行输入命令按Tab键时出现如下报错&#xff1a; 很明显&#xff0c;设备上没有空间&#xff0c;即磁盘空间不足。通过命令查看具体情况如下&#xff1a; df -h2、问题解决 首先想到的是虚拟机扩容。关机虚…

每日学习一个数据结构-树

文章目录 树的相关概念一、树的定义二、树的基本术语三、树的分类四、特殊类型的树五、树的遍历六、树的应用场景 树的遍历一、前序遍历二、中序遍历三、后序遍历使用java代码实现遍历总结 树的相关概念 树是一种重要的非线性数据结构&#xff0c;在计算机科学中有着广泛的应用…

C++IO流

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 CIO流 收录于专栏 [C进阶学习] 本专栏旨在分享学习C的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. C语言的输入与输出 2. 流是什…

(PyTorch) 深度学习框架-介绍篇

前言 在当今科技飞速发展的时代&#xff0c;人工智能尤其是深度学习领域正以惊人的速度改变着我们的世界。从图像识别、语音处理到自然语言处理&#xff0c;深度学习技术在各个领域都取得了显著的成就&#xff0c;为解决复杂的现实问题提供了强大的工具和方法。 PyTorch 是一个…

C语言基础(7)之操作符(1)(详解)

目录 1. 各种操作符介绍 1.1 操作符汇总表 2. 移位操作符 2.1 移位操作符知识拓展 —— 原码、反码、补码 2.2 移位操作符讲解 2.2.1 右移操作符 ( >> ) 2.2.2 左移操作符 ( << ) 3. 位操作符 3.1 & (按位与) 3.2 | (按位或) 3.3 ^ (按位异或) 3.4…

深度学习每周学习总结J1(ResNet-50算法实战与解析 - 鸟类识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数&#xff1a;定义损失函数&#xff0c;学习率&a…

Python 解析 html

一、场景分析 假设有如下 html 文档&#xff1a; 写一段 python 脚本&#xff0c;解析出里面的数据&#xff0c;包括经度维度。 <div classstorelist><ul><li lng"100.111111" lat"10.111111"><h4>联盟店1</h4><p>…

【C语言】数组练习

【C语言】数组练习 练习1&#xff1a;多个字符从两端移动&#xff0c;向中间汇聚练习2、二分查找 练习1&#xff1a;多个字符从两端移动&#xff0c;向中间汇聚 编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 练习2、二分查找 在⼀个升序的数组中查找指…

--- java数据结构 map set ---

java中map 和 set的底层实现是通过搜索树和哈希函桶来实现 搜索树 二叉搜索树有叫二叉排序树 他具有以下的特点 若存在左节点&#xff0c;那么他左节点的值一定小于根节点 若存在右节点&#xff0c;那么他右节点的值一定大于根节点 它的左右子树也是搜索树 对他进行中序…

Oracle架构之物理存储中各种文件详解

文章目录 1 物理存储1.1 简介1.2 数据文件&#xff08;data files&#xff09;1.2.1 定义1.2.2 分类1.2.2.1 系统数据文件1.2.2.2 撤销数据文件1.2.2.3 用户数据文件1.2.2.4 临时数据文件 1.3 控制文件&#xff08;Control files&#xff09;1.3.1 定义1.3.2 查看控制文件1.3.3…

大数据与人工智能:基础与应用的多维思考

大数据与人工智能&#xff1a;基础与应用的多维思考 前言一、时代定位与发展方向二、人工智能的本质与学科融合三、大数据和人工智能的构成要素与大众需求四、计算机系统结构与基础软件的重要性五、研究途径与领域知识的作用六、发展的态度与责任 前言 当下&#xff0c;大数据…

分布式学习02-CAP理论

文章目录 CAP三指标一致性可用性分区容错性 CAP不可能三角P存在的必要性CP理论AP理论 CAP理论对分布式系统的特性做了高度抽象&#xff0c;将其抽象为一致性、可用性、分区容错性。 并对特征间的冲突做了总结&#xff1a;CAP不可能三角。 CAP三指标 一致性&#xff08;Consis…

Windows环境Apache httpd 2.4 web服务器加载PHP8:Hello,world!

Windows环境Apache httpd 2.4 web服务器加载PHP8&#xff1a;Hello&#xff0c;world&#xff01; &#xff08;1&#xff09;首先需要安装apache httpd 2.4 web服务器&#xff1a; Windows安装启动apache httpd 2.4 web服务器-CSDN博客文章浏览阅读222次&#xff0c;点赞5次&…

Git 下载及安装超详教程(2024)

操作环境&#xff1a;Win 10、全程联网 一、什么是Git&#xff1f; Git 是一个开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 创立&#xff0c;用于有效、高速地处理从小到大的项目版本管理。Git 是目前世界上最流行的版本控制系统&#xff0c;被广泛用于软件开发中…

ECCV 2024 | 融合跨模态先验与扩散模型,快手处理大模型让视频画面更清晰!

计算机视觉领域顶级会议 European Conference on Computer Vision&#xff08;ECCV 2024&#xff09;将于9月29日至10月4日在意大利米兰召开&#xff0c;快手音视频技术部联合清华大学所发表的题为《XPSR: Cross-modal Priors for Diffusion-based Image Super-Resolution》——…

安防监控/视频系统EasyCVR视频汇聚平台如何过滤134段的告警通道?

视频汇聚/集中存储EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。平台支持国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为…