算法刷题【一本通YbtOJ1488】新的开始

2023-11-01

异想之旅:本人原创博客完全手敲,绝对非搬运,全网不可能有重复;本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告。本人所有文章仅在CSDN、掘金和个人博客(一定是异想之旅域名)发布,除此之外全部是盗文!


先说句题外话,这个标题我很喜欢,种种原因吧做这道题的时候很emo(本来应该去写次小生成树的真的没有动力才来撕这道简单题)。做完一道水题,心情尚可了。

1488:新的开始

题目描述

发展采矿业当然首先得有矿井,小 FF 花了上次探险获得的千分之一的财富请人在岛上挖了 n n n 口矿井,但他似乎忘记考虑的矿井供电问题……

为了保证电力的供应,小 FF 想到了两种办法:

  • 在这一口矿井上建立一个发电站,费用为 v v v(发电站的输出功率可以供给任意多个矿井)。
  • 将这口矿井与另外的已经有电力供应的矿井之间建立电网,费用为 p p p

小 FF 希望身为「NewBe_One」计划首席工程师的你帮他想出一个保证所有矿井电力供应的最小花费。

输入格式

第一行一个整数 n n n,表示矿井总数。

2 ∼ n + 1 2∼n+1 2n+1 行,每行一个整数,第 i i i 个数 v i v_i vi 表示在第 i i i 口矿井上建立发电站的费用。

接下来为一个 n × n n×n n×n 的矩阵 p p p,其中 p i , j p_{i,j} pi,j 表示在第 i i i 口矿井和第 j j j 口矿井之间建立电网的费用(数据保证有 p i , j = p j , i p_{i,j}=p_{j,i} pi,j=pj,i​ ,且 p i , i = 0 p_{i,i}=0 pi,i=0)。

输出格式

输出仅一个整数,表示让所有矿井获得充足电能的最小花费。

输入输出样例

In 1:

4  
5  
4 
4  
3  
0 2 2 2  
2 0 3 3  
2 3 0 4  
2 3 4 0

Out 1:

9
样例解释

小 FF 可以选择在 4 4 4 号矿井建立发电站然后把所有矿井都不其建立电网,总花费是 3 + 2 + 2 + 2 = 9 3+2+2+2=9 3+2+2+2=9

数据范围

对于 30% 的数据: 1 ≤ n ≤ 50 1≤n≤50 1n50

对于 100% 的数据: 1 ≤ n ≤ 300 , 0 ≤ v i , p i , j ≤ 1 0 5 1≤n≤300,0≤v_i,p_{i,j}≤10^5 1n300,0vi,pi,j105​​ 。

题解

看到这道题,第一眼的想法一定是去试在哪些地方放发电站吧,然而时间复杂度显然劝退。

正解:建立一个虚拟节点(编号可以分配 0 0 0 或者 n + 1 n+1 n+1),每个点到这个点都有边连接,权值大小为当前点建发电站的费用。然后针对这总共 n + 1 n+1 n+1 个点求最小生成树。

这样做的原理是每个点如果连接了真实的节点,则代表他连接了别的矿井的发电站;如果连接了这个虚拟节点,则代表新建了一座发电站。

总之无论如何最终都是保证了连通,你可以尝试在建完的最小生成树上删掉增加的虚拟节点和连接其的所有边,最小生成树拆解成了多个生成树,看起来是不是舒服、合理多了?

此时也很好证明正确性,因为(任何两个生成树之间连一条边的费用)都比((在刚刚删掉的边上,除虚拟节点外的的另一个连接点)建一个发电站的费用)高。句子有点晦涩难懂,用括号辅助理解。

下面就来看代码吧:我的代码对比别人的稍有点长,但是可读性极强,稍耐心看一下别着急划走。

并查集用了类来实现因为这样子可以减少很多变量名冲突的问题,也不复杂。这么点小数据就不用路径压缩了不够烦的慌的。

#include <bits/stdc++.h>
using namespace std;

const int N = 301;

class BCJ {
   private:
    int f[N];

   public:
    void init() {
        for (int i = 1; i <= N; i++) f[i] = i;
    }
    int find(int x) {
        while (x != f[x]) {
            x = f[x];
        }
        return x;
    }
    void merge(int x, int y) {
        x = find(x);
        y = find(y);
        f[y] = x;
    }
} bcj;

int n, v[N], p[N][N], es;

struct EDGE {
    int from, to, w;
} edge[N * N * N];

bool cmp(EDGE x, EDGE y) { return x.w < y.w; }

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> v[i];
        edge[++es].from = i;
        edge[es].to = 0;
        edge[es].w = v[i];
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> p[i][j];
            edge[++es].from = i;
            edge[es].to = j;
            edge[es].w = p[i][j];
        }
    }
    sort(edge + 1, edge + es + 1, cmp);
    bcj.init();
    int tot = 0;
    for (int i = 1; i <= es; i++) {
        int from = edge[i].from, to = edge[i].to, w = edge[i].w;
        if (bcj.find(from) != bcj.find(to)) {
            bcj.merge(from, to);
            tot += w;
        }
    }
    cout << tot << endl;

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法刷题【一本通YbtOJ1488】新的开始 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 【python 2】python 进阶

    文章目录 一 函数 1 函数的参数 2 全局变量和局部变量 3 内部函数 4 闭包 5 匿名函数 6 系统自带的函数 7 递归函数 二 文件操作 三 os 模块 1 os path 2 os 里边的函数 四 异常 五 推导式 1 列表推导式
  • 安卓平板标注pdf,坚果云+zotero+xodo

    问题描述 之前买了个平板 但是使用zotero编辑pdf会出现不能保存等问题 也就是无法实现安卓平板标注pdf且能够多平台同步 WPS是保存到本地一个副本 福昕阅读器提示只能另存或者放弃编辑 静读天下直接就没有保存 这里指的是坚果云app里
  • c++ oop面向对象

    定义基类 基类通常都应该定义一个虚析构函数 即使该函数不执行任何实际操作也是如此 基类必须将它的两种成员函数区分开来 一种是基类希望其派生类进行覆盖的函数 既虚函数 使用virtual关键字 一种是基类希望派生类直接继承而不要改变的函数 c
  • 深度学习基础篇之卷积神经网络(CNN)

    一 CNN的基本结构 首先我们来看CNN的解百纳结构 一个常见的图像识别CNN模型如下图 从图中可以看出最左边的图像就是模型的输入层 在计算机中就是若干个矩阵 这点与DNN类似 接着是卷积层 Convolution Layer 这个层是CN
  • VUE之高德地图轨迹绘制与轨迹回放

    步骤 安装依赖 npm install vue amap S main js中注册 import AMap from vue amap Vue use AMap AMap initAMapApiLoader key 你申请的key plug
  • mysql到sqlite数据传输

    在实际的工作中需要将mysql数据库表中的数据同步到sqlite对应的表中 主要有两种方法 第一种是使用Navicat里的数据传输 第二种是使用程序来实现 第一种 程序实现 1 添加sqlite驱动 本项目是通过maven管理 在pom x
  • kali linux eth0网卡消失解决方法

    eth0网卡消失 不知道什么原因 kali的eth0网卡突然不见了 ifconfig 发现eth0网卡不见了之后可以使用 ifconfig eth0 up 但是 eth0没有ipv4地址 还是没有办法上网 然后我们打开interfaces修
  • WebSocket 详解教程

    概述 WebSocket 是什么 WebSocket 是一种网络通信协议 RFC6455 定义了它的通信标准 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议 为什么需要 WebSocket 了解
  • Jmeter学习

    个人学习笔记 接口测试分类 接口架构 接口测试要点 接口测试工具 一 接口测试分类 内部接口 1 被测系统各个子模块之间的接口 或被测系统提供给内部使用的接口 外部接口 1 被测系统调用外部接口 2 系统对外提供的接口 二 接口架构 1 基
  • 13款经典JavaScript图形和图表绘制工具

    IT168 技术 如今 在互联网上发布在线免费的Javascript图形和图表绘制工具越来越多 作者此前在一家网站从事复杂的图形学方面的工作 使用highchart 在那期间 没有大量的插件工具可供选择 不像现在 我们可以轻易地找到非常有用
  • 硬件安全技术——芯片安全设计技术4(PUF)

    芯片安全设计技术4 PUF 一 什么是PUF 1 物理不可克隆函数 PUF 2 PUF特性 3 PUF结构 5 与TrustZone技术的区别 二 SRAM PUF特点 1 SRAM PUF 2 SRAM PUF Key存储 3 SRAM
  • Linux配置串口管理以及串口自动登录

    1 配置串口管理 echo S0 12345 respawn sbin agetty ttyS0 115200 gt gt etc inittab vim etc default grub GRUB CMDLINE LINUX DEFAUL
  • 不可压库艾特流的数值解计算机语言,不可压库埃特流的数值解学生洪安仕专业.ppt...

    不可压库埃特流的数值解学生洪安仕专业 学生 杜春雨 洪安仕 专业 化学工程 学号 1014207010 1014207014 学生 杜春雨 专业 化学工程 学号 1014207010 学生 洪安仕 专业 化学工程 学号 1014207014
  • 便携式CAN分析仪、CAN接口卡、USBCAN 如何选型?

    USBCAN系列便携式CAN分析仪 通过USB接口快速扩展一路CAN通道 使接入CAN网络非常容易 它具有一体式和小巧紧凑的外形 特别适合于随身携带 CAN接口采用金升阳CAN隔离收发模块实现3000V DC电气隔离 USB接口ESD静电防
  • 详解Linux中atime,mtime,ctime的使用场景

    一 文件与文件夹三个时间 atime mtime ctime的含义 1 含义 atime Access Time 文件最近被访问时间 mtime Modify Time 文件最近内容修改时间 ctime Change Time 文件最近权限
  • 仅需3 小时,如何用 AI 做场景贴图,完成场景制作 ?AI创作工作流探索

    Mixlab无界社区 跨学科 AI艺术 大家好 我是海辛 是一名影视导演 上面这张图是我通过 Midjourney Blender 制作的最新作品 露娜在元宇宙的拉面店 制作的目标是为了露娜将来在元宇宙能有一份赖以为生的工作 决定给她装修一
  • 10.在两个数之间,求素数

    问题 输入两个数 求在这两个数之间的素数 分析思路 素数 什么是素数 素数就是很朴素的一个数 它只跟1和自己玩 不跟其他数字玩 因此 它只可以被1和自身整除 1不是素数 1 从键盘输入两个数字 scanf 2 判断素数 需要用一个数字 从头
  • 蓝桥杯第十届(2019)B组省赛1-9题练手源码

    1 组队 枚举 题目 作为篮球队教练 你需要从以下名单中选出 1 号位至 5 号位各一名球员 组成球队的首发阵容 每位球员担任 1 号位至 5 号位时的评分如下表所示 请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少 题解 过
  • java api签名验证

    https my oschina net KelinM blog 1925209 https blog csdn net u010096717 article details 84558463 https blog csdn net ma
  • 算法刷题【一本通YbtOJ1488】新的开始

    异想之旅 本人原创博客完全手敲 绝对非搬运 全网不可能有重复 本人无团队 仅为技术爱好者进行分享 所有内容不牵扯广告 本人所有文章仅在CSDN 掘金和个人博客 一定是异想之旅域名 发布 除此之外全部是盗文 先说句题外话 这个标题我很喜欢 种