【蓝桥杯冲冲冲】k 短路 / [SDOI2010] 魔法猪学院

蓝桥杯备赛 | 洛谷做题打卡day33

文章目录

  • 蓝桥杯备赛 | 洛谷做题打卡day33
    • 题目背景
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
      • 数据规模
      • 数据更新日志
    • 题解代码
    • 我的一些话

  • 【模板】k 短路 / [SDOI2010] 魔法猪学院

    题目背景

    注:对于 k k k 短路问题,A* 算法的最坏时间复杂度是 O ( n k log ⁡ n ) O(nk \log n) O(nklogn) 的。虽然 A* 算法可以通过本题原版数据,但可以构造数据,使得 A* 算法在原题的数据范围内无法通过。事实上,存在使用可持久化可并堆的算法可以做到在 O ( ( n + m ) log ⁡ n + k log ⁡ k ) O((n+m) \log n + k \log k) O((n+m)logn+klogk) 的时间复杂度解决 k k k 短路问题。详情见 OI-Wiki。

    题目描述

    iPig 在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练。经过了一周理论知识和一周基本魔法的学习之后,iPig 对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的;元素与元素之间可以互相转换;能量守恒 … \ldots

    iPig 今天就在进行一个麻烦的测验。iPig 在之前的学习中已经知道了很多种元素,并学会了可以转化这些元素的魔法,每种魔法需要消耗 iPig 一定的能量。作为 PKU 的顶尖学猪,让 iPig 用最少的能量完成从一种元素转换到另一种元素 … \ldots 等等,iPig 的魔法导猪可没这么笨!这一次,他给 iPig 带来了很多 1 1 1 号元素的样本,要求 iPig 使用学习过的魔法将它们一个个转化为 N N N 号元素,为了增加难度,要求每份样本的转换过程都不相同。这个看似困难的任务实际上对 iPig 并没有挑战性,因为,他有坚实的后盾 … \ldots 现在的你呀!

    注意,两个元素之间的转化可能有多种魔法,转化是单向的。转化的过程中,可以转化到一个元素(包括开始元素)多次,但是一但转化到目标元素,则一份样本的转化过程结束。iPig 的总能量是有限的,所以最多能够转换的样本数一定是一个有限数。具体请参看样例。

    输入格式

    第一行三个数 N , M , E N, M, E N,M,E,表示 iPig 知道的元素个数(元素从 1 1 1 N N N 编号),iPig 已经学会的魔法个数和 iPig 的总能量。

    后跟 M M M 行每行三个数 s i , t i , e i s_i, t_i, e_i si,ti,ei 表示 iPig 知道一种魔法,消耗 e i e_i ei 的能量将元素 s i s_i si 变换到元素 t i t_i ti

    输出格式

    一行一个数,表示最多可以完成的方式数。输入数据保证至少可以完成一种方式。

    样例 #1

    样例输入 #1

    4 6 14.9
    1 2 1.5
    2 1 1.5
    1 3 3
    2 3 1.5
    3 4 1.5
    1 4 1.5
    

    样例输出 #1

    3
    

在这里插入图片描述

提示

有意义的转换方式共 4 4 4 种:

1 → 4 1\to 4 14,消耗能量 1.5 1.5 1.5

1 → 2 → 1 → 4 1\to 2\to 1\to 4 1214,消耗能量 4.5 4.5 4.5

1 → 3 → 4 1\to3\to4 134,消耗能量 4.5 4.5 4.5

1 → 2 → 3 → 4 1\to2\to3\to4 1234,消耗能量 4.5 4.5 4.5

显然最多只能完成其中的 3 3 3 种转换方式(选第一种方式,后三种方式仍选两个),即最多可以转换 3 3 3 份样本。

如果将 E = 14.9 E=14.9 E=14.9 改为 E = 15 E=15 E=15,则可以完成以上全部方式,答案变为 4 4 4

数据规模

占总分不小于 10 % 10\% 10% 的数据满足 N ≤ 6 , M ≤ 15 N \leq 6,M \leq 15 N6,M15

占总分不小于 20 % 20\% 20% 的数据满足 N ≤ 100 , M ≤ 300 , E ≤ 100 N \leq 100,M \leq 300,E\leq100 N100,M300,E100 E E E 和所有的 e i e_i ei 均为整数(可以直接作为整型数字读入)。

所有数据满足 2 ≤ N ≤ 5000 2 \leq N \leq 5000 2N5000 1 ≤ M ≤ 200000 1 \leq M \leq 200000 1M200000 1 ≤ E ≤ 1 0 7 1 \leq E \leq 10 ^ 7 1E107 1 ≤ e i ≤ E 1 \leq ei\leq E 1eiE E E E 和所有的 e i e_i ei 为实数。

数据更新日志

  • 2010/xx/xx:原版数据;

  • 2018/03/02:@kczno1 添加了 一组数据;

  • 2018/04/20:@X_o_r 添加了 一组数据;

  • 2021/01/08:@LeavingZ 添加了 两组数据。

题解代码

学会利用新知,自己多试试并尝试积攒一些固定解答方案,debug,以下是题解代码 ~

# include <bits/stdc++.h>
using namespace std;
typedef long long ll;template <class Num> inline void Cmax(Num &x, const Num y) {x = y > x ? y : x;
}template <class Num> inline void Cmin(Num &x, const Num y) {x = y < x ? y : x;
}const int maxn(5005);
const int maxm(2e5 + 5);
const double eps(1e-8);int n, m, first[maxn], cnt, vis[maxn], rt[maxn], tot, cov[maxm << 1], ans, fa[maxn];
double se, e, dis[maxn];
priority_queue < pair <double, int> > q;struct Heap {int ls, rs, dis, ed;double w;
} tr[maxm * 20];struct Edge {int to, next;double w;
} edge[maxm << 1];inline void Add(int u, int v, double w) {edge[cnt] = (Edge){v, first[u], w}, first[u] = cnt++;edge[cnt] = (Edge){u, first[v], w}, first[v] = cnt++;
}inline int NewNode(double w, int ed) {int x = ++tot;tr[x].w = w, tr[x].dis = 1, tr[x].ed = ed;return x;
}int Merge(int x, int y) {if (!x || !y) return x + y;if (tr[x].w - tr[y].w >= eps) swap(x, y);int p = ++tot;tr[p] = tr[x], tr[p].rs = Merge(tr[p].rs, y);if (tr[tr[p].ls].dis < tr[tr[p].rs].dis) swap(tr[p].ls, tr[p].rs);tr[p].dis = tr[tr[x].rs].dis + 1;return p;
}void Dfs(int u) {vis[u] = 1;for (int e = first[u], v; e != -1; e = edge[e].next)if (e & 1) {double w = edge[e].w;if (fabs(dis[u] + w - dis[v = edge[e].to]) < eps && !vis[v])fa[v] = u, cov[e ^ 1] = 1, Dfs(v);}
}int main() {memset(first, -1, sizeof(first));memset(dis, 127, sizeof(dis));scanf("%d%d%lf", &n, &m, &se);for (int i = 1, u, v; i <= m; ++i) scanf("%d%d%lf", &u, &v, &e), Add(u, v, e);dis[n] = 0, q.push(make_pair(0, n));while (!q.empty()) {int u = q.top().second;q.pop();if (vis[u]) continue;vis[u] = 1;for (int e = first[u]; ~e; e = edge[e].next)if (e & 1) {int v = edge[e].to;if (dis[v] - (dis[u] + edge[e].w) >= eps)q.push(make_pair(-(dis[v] = dis[u] + edge[e].w), v));}}for (int i = 1; i <= n; ++i) vis[i] = 0;Dfs(n);for (int e = 0, u, v; e < cnt; e += 2)if (!cov[e]) {u = edge[e ^ 1].to, v = edge[e].to;if (dis[u] == dis[0] || dis[v] == dis[0]) continue;rt[u] = Merge(rt[u], NewNode(dis[v] + edge[e].w - dis[u], v));}for (int i = 1; i <= n; ++i) q.push(make_pair(-dis[i], i));for (int i = 1, u; i <= n; ++i) {u = q.top().second, q.pop();if (fa[u]) rt[u] = Merge(rt[u], rt[fa[u]]);}if (dis[1] - se < eps) se -= dis[1], ++ans;if (rt[1]) q.push(make_pair(-tr[rt[1]].w, rt[1]));while (!q.empty()) {int ed = q.top().second;double cur = q.top().first, w = dis[1] - cur;if (w - se >= eps) break;q.pop(), se -= w, ++ans;for (int i = 0; i < 2; ++i) {int nxt = i ? tr[ed].rs : tr[ed].ls;if (nxt) q.push(make_pair(cur + tr[ed].w - tr[nxt].w, nxt));}if (rt[tr[ed].ed]) q.push(make_pair(cur - tr[rt[tr[ed].ed]].w, rt[tr[ed].ed]));}printf("%d\n", ans);return 0;
}

我的一些话

  • 今天学习动态规划,dp属于比较难的部分,这题利用记忆化搜索即可快速解决,需要多动脑,多思考思路还是很好掌握的,虽然一次性AC有一定难度,需要通盘的考虑和理解,以及扎实的数据结构基础才能独立写出AC代码。但无论难易,大家都要持续做题,保持题感喔!一起坚持(o´ω`o)

  • 如果有非计算机专业的uu自学的话,关于数据结构的网课推荐看b站上青岛大学王卓老师的课,讲的很细致,有不懂都可以私信我喔

  • 总结来说思路很重要,多想想,多在草稿纸上画画,用测试数据多调试,debug后成功编译并运行出正确结果真的会感到很幸福!

  • 关于之前蓝桥杯备赛的路线和基本方法、要掌握的知识,之前的博文我都有写,欢迎大家关注我,翻阅自取哦~

  • 不管什么都要坚持吧,三天打鱼两天晒网无法形成肌肉记忆和做题思维,该思考的时候一定不要懈怠,今天就说这么多啦,欢迎评论留言,一起成长:)

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

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

相关文章

机器学习11-前馈神经网络识别手写数字1.0

在这个示例中&#xff0c;使用的神经网络是一个简单的全连接前馈神经网络&#xff0c;也称为多层感知器&#xff08;Multilayer Perceptron&#xff0c;MLP&#xff09;。这个神经网络由几个关键组件构成&#xff1a; 1. 输入层 输入层接收输入数据&#xff0c;这里是一个 28x…

93 log4j-slf4j-impl 搭配上 log4j-to-slf4j 导致的 StackOverflow

前言 呵呵 最近想要 做一个 mongo 低版本的客户端读取高版本的服务端传递过来的数据造成的一个错误的时候, 出现了这样的问题 引入了 mongo-java-driver 之后, 使用相关 api 的时候会触发 com.mongo.internal.connection.BaseCluser 的初始化, 其依赖的 Loggers 间接的依赖…

SQLite database实现加密

注意&#xff1a;以下操作以VS2022为开发工具&#xff0c;以C#为开发语言。 数据加密原因 软件在使用的各个场景&#xff0c;很多都需要数据具有保密性&#xff0c;于是对于数据库就需要加密。特别是在某些特定领域或存储敏感数据尤其如此。 SQLite加密实现 SQLite加密有两种…

问题:2、计算机网络的目标是实现________。 #媒体#知识分享

问题&#xff1a;2、计算机网络的目标是实现________。 A&#xff0e;数据处理 B&#xff0e;信息传输与数据处理 C&#xff0e;资源共享与信息传输 D&#xff0e;文献查询 参考答案如图所示

c++之说_11|自定义类型 enum(枚举)与enumclass (c11新枚举)

至于枚举 会用就行 至少目前我感觉没什么太多问题 enum 被称为无作用域枚举 &#xff0c; enumclass / enumstruct 被称为有作用域枚举 看到了吧 语法规则 和 struct 差不多 只不过枚举成员 只是一个标志 它本质是数值 从上到下 下面的数根据上面的数 加 1 也可以直接…

表单标记(html)

前言 发现input的type属性还是有挺多的&#xff0c;这里把一些常用的总结一下。 HTML 输入类型 (w3school.com.cn)https://www.w3school.com.cn/html/html_form_input_types.asp text-文本 文本输入,如果文字太长&#xff0c;超出的部分就不会显示。 定义供文本输入的单行…

visual studio和cmake如何编译dlib库

官网 dlib C Library 对应的是最新版本&#xff0c;只能用到vs2015版本及以后 如果使用vs2013&#xff0c;所以需要下载vs2013可用的版本。 就是说dlib版本与vs版本有对应关系 所有版本 dlib C Library - Browse /dlib at SourceForge.net Releases davisking/dlib GitHu…

docker常用10条容器操作命令

Docker 中一些常用的容器操作命令&#xff0c;我们可以根据需要使用这些命令来管理和操作 Docker 容器。我们这次以Hell-world这个镜像为例来说明&#xff1a; 1. docker pull hello-world #拉取hell-world镜像 2. docker images # 查看本地拉取的镜像 或者可以用 docker im…

离线数仓(一)【数仓概念、需求架构】

前言 今天开始学习数仓的内容&#xff0c;之前花费一年半的时间已经学完了 Hadoop、Hive、Zookeeper、Spark、HBase、Flume、Sqoop、Kafka、Flink 等基础组件。把学过的内容用到实践这是最重要的&#xff0c;相信会有很大的收获。 1、数据仓库概念 1.1、概念 数据仓库&#x…

代码随想录算法训练营day15||二叉树part02、102.二叉树的层序遍历、 226.翻转二叉树(优先掌握递归)、101. 对称二叉树 (优先掌握递归)

102.二叉树的层序遍历 题目&#xff1a;给你一个二叉树&#xff0c;请你返回其按 层序遍历 得到的节点值。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 接下来我们再来介绍二叉树的另一种遍历方式&#xff1a;层序遍历。 层序遍历一个二叉树。就是…

计算机视觉 | OpenCV 实现手势虚拟控制亮度和音量

Hi&#xff0c;大家好&#xff0c;我是半亩花海。在当今科技飞速发展的时代&#xff0c;我们身边充斥着各种智能设备&#xff0c;然而&#xff0c;如何更便捷地与这些设备进行交互却是一个不断被探索的课题。本文将主要介绍一个基于 OpenCV 的手势识别项目&#xff0c;通过手势…

【制作100个unity游戏之24】unity制作一个3D动物AI生态系统游戏3(附项目源码)

最终效果 文章目录 最终效果系列目录前言随着地面法线旋转在地形上随机生成动物不同部位颜色不同最终效果源码完结系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第24篇中,我们将探索如何用unity制作一…

ClickHouse--02--安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 安装官网 &#xff1b;[https://clickhouse.com/docs/zh/getting-started/install](https://clickhouse.com/docs/zh/getting-started/install)![在这里插入图片描述…

Hadoop-IDEA开发平台搭建

1.安装下载Hadoop文件 1&#xff09;hadoop-3.3.5 将下载的文件保存到英文路径下&#xff0c;名称一定要短。否则容易出问题&#xff1b; 2&#xff09;解压下载下来的文件&#xff0c;配置环境变量 3&#xff09;我的电脑-属性-高级设置-环境变量 4.详细配置文件如下&#…

使用navicat导出mysql离线数据后,再导入doris的方案

一、背景 doris本身是支持直接从mysql中同步数据的&#xff0c;但有时候&#xff0c;客户不允许我们使用doris直连mysql&#xff0c;此时就需要客户配合将mysql中的数据手工导出成离线文件&#xff0c;我们再导入到doris中 二、环境 doris 1.2 三、方案 doris支持多种导入…

探索C语言的内存魔法:动态内存管理解析

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C语言学习 贝蒂的主页&#xff1a;Betty‘s blog 1. 静态开辟内存 通过前面的学习&#xff0c;我们已经掌握了两种开辟内存的方…

ruoyi-nbcio中xxl-job的安装与使用

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a; http://122.227.135.243:9666 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbach…

Netty应用(四) 之 Reactor模型 零拷贝

目录 6.Reactor模型 6.1 单线程Reactor 6.2 主从多线程Reactor (主--->Boss | 从--->Worker | 一主多从机制) 7.扩展与补充 8.Reactor模型的实现 8.1 多线程Reactor模型的实现&#xff08;一个Boss线程&#xff0c;一个Worker线程&#xff09; 8.2 多线程Reactor模…

Python程序员面试题精选及解析(2)

本文精心挑选了10道Python程序员面试题&#xff0c;覆盖了Python的多个核心领域&#xff0c;包括装饰器、lambda函数、列表推导式、生成器、全局解释器锁(GIL)、单例模式以及上下文管理器等。每道题都附有简洁的代码示例&#xff0c;帮助读者更好地理解和应用相关知识点无论是对…

【Java EE初阶十一】文件操作(IO)

1. 认识文件 所谓的文件是一个广义的概念&#xff0c;可以代表很多东西&#xff1b;在操作系统里面&#xff0c;会把很多的硬件设备和软件设备都抽象成“文件”&#xff0c;统一进行管理&#xff1b;但是大部分情况下&#xff0c;我们读到的文件&#xff0c;都是指硬盘的文件&a…