【蓝桥杯冲冲冲】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.mzph.cn/news/679133.shtml

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

相关文章

正则可视化工具:学习和编写正则表达式的利器

引言 正则表达式是一种强大的文本匹配和处理工具&#xff0c;但对于初学者和非专业开发者来说&#xff0c;编写和理解正则表达式可能是一项具有挑战性的任务。为了帮助人们更好地学习和编写正则表达式&#xff0c;正则可视化工具应运而生。本文将探讨正则可视化工具的优点&…

并行计算导论 笔记 1

目录 并行编程平台隐式并行超标量执行/指令流水线超长指令字处理器 VLIW 内存性能系统的局限避免内存延迟的方法 并行计算平台控制结构通信模型共享地址空间平台消息传递平台对比 物理组织理想并行计算机并行计算机互联网络网络拓朴结构基于总线的网络交叉开关网络多级网络全连…

leaflet 显示自己geoserver发布的中国地图

安装vscode 安装 通义灵码 问题&#xff1a; 用leaflet显示一个wms地图 修改下代码&#xff0c;结果如下&#xff1a; 例子代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport&q…

自然语言处理(NLP)—— 基本概念

自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;是人工智能和语言学领域的一个分支&#xff0c;它涉及到计算机和人类&#xff08;自然&#xff09;语言之间的相互作用。它的主要目标是让计算机能够理解、解释和生成人类语言的数据。NLP结…

极狐GitLab 与钉钉的集成实践

DingTalk OAuth 2.0 OmniAuth provider * 引入于 14.5 版本。 您可以使用您的钉钉账号登录极狐GitLab。 登录钉钉开放平台&#xff0c;创建应用。钉钉会生成一个客户端 ID 和密钥供您使用。 登录钉钉开放平台。 在顶部栏上&#xff0c;选择 应用程序开发 > 企业内部开发&am…

【EAI 015】CLIPort: What and Where Pathways for Robotic Manipulation

论文标题&#xff1a;CLIPort: What and Where Pathways for Robotic Manipulation 论文作者&#xff1a;Mohit Shridhar1, Lucas Manuelli, Dieter Fox1 作者单位&#xff1a;University of Washington, NVIDIA 论文原文&#xff1a;https://arxiv.org/abs/2109.12098 论文出处…

【数据结构】链式队列解析(C语言版)

数据结构——链队列解析过程和简单代码实现&#xff1a; 一、简单概念&#xff1a; 动图展示&#xff1a; (1)入队&#xff1a;(2)出队&#xff1a; 二、顺序队列&#xff1a; 思路步奏&#xff1a; &#xff08;1&#xff09;入队操作&#xff1a;&#xff08;2&#xff09;出…

《统计学简易速速上手小册》第6章:多变量数据分析(2024 最新版)

文章目录 6.1 主成分分析&#xff08;PCA&#xff09;6.1.1 基础知识6.1.2 主要案例&#xff1a;客户细分6.1.3 拓展案例 1&#xff1a;面部识别6.1.4 拓展案例 2&#xff1a;基因数据分析 6.2 聚类分析6.2.1 基础知识6.2.2 主要案例&#xff1a;市场细分6.2.3 拓展案例 1&…

第2讲投票系统后端架构搭建

创建项目时&#xff0c;随机选择一个&#xff0c;后面会生成配置properties文件 生成文件 maven-3.3.3 设置阿里云镜像 <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more cont…

【Python】Mac 本地部署 stable-diffusion

其实要在本地部署 stable-diffusion 不难&#xff0c;只要有“魔法”一切都水到渠成&#xff0c;如下图&#xff1a; (base) MacBook-Pro python % git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui Cloning into stable-diffusion-webui... remote: Enu…

前端JavaScript篇之setTimeout、Promise、Async/Await 的区别

目录 setTimeout、Promise、Async/Await 的区别**setTimeout**:思路需要注意的 **Promise**:思路需要注意的 **Async/Await**:思路需要注意的 总结 setTimeout、Promise、Async/Await 的区别 setTimeout: 概念&#xff1a;setTimeout是JavaScript中的一个函数&#xff0c;用于…

c++求三个数中最大数

#include<iostream> using namespace std; int main() { int a,b,c; cout<<"请输入三个数字"<<endl;//end后面为小写的L cin>>a>>b>>c; if(a>b&&a>c) cout<<"最大数为a:"<<a<<e…

【MySQL】——数值函数的学习

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-Z1fAnfrxGD7I5gqp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

JAVA设计模式之访问模式详解

访问者模式 1 访问者模式介绍 访问者模式在实际开发中使用的非常少,因为它比较难以实现并且应用该模式肯能会导致代码的可读性变差,可维护性变差,在没有特别必要的情况下,不建议使用访问者模式. 访问者模式(Visitor Pattern) 的原始定义是&#xff1a;允许在运行时将一个或多…

Java集合 LinkedList

目录 LinkedList实例 LinkedList LinkedList是Java中的一个重要的数据结构&#xff0c;它实现了List接口&#xff0c;提供了链表数据结构的实现。LinkedList类中包含了各种常用的链表操作&#xff0c;如添加、删除、查找等。 LinkedList的特点是元素可以动态地添加到链表的任…

关于创建vue项目报错command failed: npm install --loglevel error

一、首先 在这个目录下有个文件叫.vuerc 二、其次 进去之后把里面的"useTaobaoRegistry": false,修改下&#xff0c;我之前是true&#xff0c;后来改成了false才成功。

【数据结构】11 堆栈(顺序存储和链式存储)

定义 可认为是具有一定约束的线性表&#xff0c;插入和删除操作都在一个称为栈顶的端点位置。也叫后入先出表&#xff08;LIFO&#xff09; 类型名称&#xff1a;堆栈&#xff08;STACK&#xff09; 数据对象集&#xff1a; 一个有0个或者多个元素的有穷线性表。 操作集&#…

单片机与外设的交互

单片机与外设的交互是嵌入式系统中非常重要的一个基础知识点。单片机是一个集成在同一芯片上的中央处理器、存储器和输入/输出接口,它可以根据用户编写的程序与各种外部设备即外设进行交互。单片机与外设之间的交互主要通过单片机上的输入/输出口(I/O口)来实现。 I/O口的工作原…

一个适用于后渗透期间的信息收集工具

介绍 Pillager是一个适用于后渗透期间的信息收集工具&#xff0c;可以收集目标机器上敏感信息&#xff0c;方便下一步渗透工作的进行。 支持 注&#xff1a;✅表示经过测试&#xff0c;&#x1f6a7;表示理论上支持但未经测试&#xff0c;❌表示无此功能或不支持 后续将会陆续…

CSP-202006-1-线性分类器

CSP-202006-1-线性分类器 解题思路 通过比较第一个训练数据点的类别和直线函数值的正负来确定标准类别和标准函数值的正负。循环遍历训练数据中的每个点&#xff0c;计算直线函数值并与标准函数值比较&#xff0c;以确定该点所在的类别。 如果当前点的类别与标准类别一致&…