分层图最短路
常见情形:
对于边有k次操作的题。。
整体思想:
分层图最短路可以视作是dijkstra的一个扩展,通常用于处理N小于10000,或者是k不大的情形。整体有点类似于拆点。将一个点拆成k个点处理。层与层之间互不影响。
好了我就说这么多,剩下来的交给想象力,这个自己相通了就不难理解。
经典例题:
一:3095. 冻结
“我要成为魔法少女!”
“那么,以灵魂为代价,你希望得到什么?”
“我要将有关魔法和奇迹的一切,封印于卡片之中......”
在这个愿望被实现以后的世界里,人们享受着魔法卡片(SpellCard,又名符卡)带来的便捷。
现在,不需要立下契约也可以使用魔法了!
你还不来试一试?
比如,我们在魔法百科全书(Encyclopedia of Spells)里用“freeze”作为关键字来查询,会有很多有趣的结果。
例如,我们熟知的 Cirno,她的冰冻魔法当然会有对应的 SpellCard 了。
当然,更加令人惊讶的是,居然有冻结时间的魔法,Cirno 的冻青蛙比起这些来真是小巫见大巫了。
这说明之前的世界中有很多魔法少女曾许下控制时间的愿望,比如 Akemi Homura、Sakuya Izayoi......
当然,在本题中我们并不是要来研究历史的,而是研究魔法的应用。
我们考虑最简单的旅行问题吧:
现在这个大陆上有 NN 个城市,MM 条双向的道路。
城市编号为 1∼N1∼N,我们在 11 号城市,需要到 NN 号城市,怎样才能最快地到达呢?
这不就是最短路问题吗?
我们都知道可以用 Dijkstra、Bellman-Ford、Floyd-Warshall 等算法来解决。
现在,我们一共有 KK 张可以使时间变慢 50%50% 的 SpellCard,也就是说,在通过某条路径时,我们可以选择使用一张卡片,这样,我们通过这一条道路的时间就可以减少到原先的一半。
需要注意的是:
- 在一条道路上最多只能使用一张 SpellCard。
- 使用一张 SpellCard 只在一条道路上起作用。
- 你不必使用完所有的 SpellCard。
给定以上的信息,你的任务是:
求出在可以使用这不超过 KK 张时间减速的 SpellCard 之情形下,从城市 11 到城市 NN 最少需要多长时间。
输入格式
第一行包含三个整数:N、M、KN、M、K。
接下来 MM 行,每行包含三个整数:Ai、Bi、TimeiAi、Bi、Timei,表示存在一条 AiAi 与 BiBi 之间的双向道路,在不使用 SpellCard 之前提下,通过它需要 TimeiTimei 的时间。
输出格式
输出一个整数,表示从 11 号城市到 NN 号城市的最小用时。
数据范围
1≤K≤N≤501≤K≤N≤50,
1≤M≤10001≤M≤1000,
1≤Ai,Bi≤N1≤Ai,Bi≤N,
2≤Timei≤20002≤Timei≤2000,
为保证答案为整数,保证所有的 TimeiTimei 均为偶数。
所有数据中的无向图保证无自环、重边,且是连通的。输入样例:
4 4 1 1 2 4 4 2 6 1 3 8 3 4 8输出样例:
7样例解释
在不使用 SpellCard 时,最短路为 1→2→41→2→4,总时间为 1010。
现在我们可以使用 11 次 SpellCard,那么我们将通过 2→42→4 这条道路的时间减半,此时总时间为 77。
#include<bits/stdc++.h> using namespace std; const int N=60,M=2010; typedef pair<int,pair<int,int>>PII; int h[N],e[M],ne[M],w[M],idx; int dis[N][N]; bool st[N][N]; int n,m,k; void add(int a,int b,int c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++; } void dij() {memset(dis,0x3f,sizeof dis);priority_queue<PII,vector<PII>,greater<PII>>q;q.push({0,{1,0}});dis[1][0]=0;while(q.size()){auto t=q.top();q.pop();int v=t.second.first;int u=t.second.second;if(st[v][u]){continue;}st[v][u]=true;for(int i=h[v];~i;i=ne[i]){int j=e[i];if(st[j][u]){continue;}if(u+1<=k){if(dis[j][u+1]>dis[v][u]+w[i]/2){dis[j][u+1]=dis[v][u]+w[i]/2;q.push({dis[j][u+1],{j,u+1}});}}if(dis[j][u]>dis[v][u]+w[i]){dis[j][u]=dis[v][u]+w[i];q.push({dis[j][u],{j,u}});}}} } void solve() {cin>>n>>m>>k;memset(h,-1,sizeof h);for(int i=1;i<=m;i++){int a,b,c;cin>>a>>b>>c;add(a,b,c);add(b,a,c);}dij();int ans=0x3f3f3f3f;for(int i=0;i<=k;i++){//cout<<dis[n][i]<<endl;ans=min(dis[n][i],ans);}cout<<ans; } int main() {ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);solve();return 0; }
二:340. 通信线路
在郊区有 NN 座通信基站,PP 条 双向 电缆,第 ii 条电缆连接基站 AiAi 和 BiBi。
特别地,11 号基站是通信公司的总站,NN 号基站位于一座农场中。
现在,农场主希望对通信线路进行升级,其中升级第 ii 条电缆需要花费 LiLi。
电话公司正在举行优惠活动。
农产主可以指定一条从 11 号基站到 NN 号基站的路径,并指定路径上不超过 KK 条电缆,由电话公司免费提供升级服务。
农场主只需要支付在该路径上剩余的电缆中,升级价格最贵的那条电缆的花费即可。
求至少用多少钱可以完成升级。
输入格式
第 11 行:三个整数 N,P,KN,P,K。
第 2..P+12..P+1 行:第 i+1i+1 行包含三个整数 Ai,Bi,LiAi,Bi,Li。
输出格式
包含一个整数表示最少花费。
若 11 号基站与 NN 号基站之间不存在路径,则输出 −1−1。
数据范围
0≤K<N≤10000≤K<N≤1000,
1≤P≤100001≤P≤10000,
1≤Li≤10000001≤Li≤1000000输入样例:
5 7 1 1 2 5 3 1 4 2 4 8 3 2 3 5 2 9 3 4 7 4 5 6输出样例:
4#include<bits/stdc++.h> using namespace std; typedef pair<int, pair<int, int>>PII; const int N = 1010,M=20010; int h[N], e[M], ne[M], w[M], idx; int dis[N][N]; bool st[N][N]; int n, m, k; int ans=0x3f3f3f3f; void add(int a, int b, int c) {e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++; } void dij() {memset(dis, 0x3f, sizeof dis);priority_queue<PII, vector<PII>, greater<PII>>q;q.push({ 0,{1,0} });dis[1][0] = 0;while (q.size()) {auto t = q.top();q.pop();int v = t.second.first;int u = t.second.second;if (st[v][u]) {continue;}st[v][u] = true;for (int i = h[v];~i;i = ne[i]) {int j = e[i];if (st[j][u]) {continue;}if (u + 1 <= k) {if (dis[j][u + 1] > dis[v][u] ) {dis[j][u + 1] = dis[v][u] ;q.push({ dis[j][u + 1],{j,u + 1} });}}if (dis[j][u] > max(dis[v][u] , w[i])) {dis[j][u] =max( dis[v][u] , w[i]);q.push({ dis[j][u], { j,u } });}}} } void solve() {cin >> n >> m >> k;memset(h, -1, sizeof h);for (int i = 1;i <= m;i++) {int a, b, c;cin >> a >> b >> c;add(a, b, c);add(b, a, c);}dij();for (int i = 0;i <= k;i++) {//cout << dis[n][i] << endl;ans = min(ans, dis[n][i]);}if (ans == 0x3f3f3f3f) {cout << -1;}else {cout << ans;} } int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);solve();return 0; }
相关文章:
分层图最短路
常见情形: 对于边有k次操作的题。。 整体思想: 分层图最短路可以视作是dijkstra的一个扩展,通常用于处理N小于10000,或者是k不大的情形。整体有点类似于拆点。将一个点拆成k个点处理。层与层之间互不影响。 好了我就说这么多&…...
vue3 基本使用
Vue 3 提供了多种方式来构建用户界面,包括选项式 API 和 Composition API。下面我将详细介绍 Vue 3 的基本使用和语法,主要集中在选项式 API 上,因为这对于初学者来说更容易上手。 1. 创建 Vue 项目 如果你还没有一个 Vue 项目,…...
【maven-4】IDEA 配置本地 Maven 及如何使用 Maven 创建 Java 工程
IntelliJ IDEA(以下简称 IDEA)是一款功能强大的集成开发环境,广泛应用于 Java 开发。下面将详细介绍如何在 IDEA 中配置本地 Maven,并创建一个 Maven Java 工程,快速上手并高效使用 Maven 进行 Java 开发。 1. Maven …...
种花问题算法
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。 给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 …...
对于大规模的淘宝API接口数据,有什么高效的处理方法?
1.数据分批处理 原理:当处理大规模数据时,一次性将所有数据加载到内存中可能会导致内存溢出。将数据分成较小的批次进行处理可以有效避免这个问题。示例代码:假设通过淘宝 API 获取到了一个包含大量商品详情的 JSON 数据列表,每个…...
openharmony 使用uvc库获取摄像头数据使用nativewindow显示
界面代码: XComponent({ id: xcomponentId, type: texture, libraryname: entry }).width(800).height(500) Natvie代码: 1、头文件 //NativeWindow #include <ace/xcomponent/native_interface_xcomponent.h> #include <cstdint> #incl…...
SQL Server 实战 - 多种连接
目录 背景 一、多种连接 1. 复合连接条件 2. 跨数据库连接 3. 隐连接 4. 自连接 5. 多表外连接 6. UNION ALL 二、一个对比例子 背景 本专栏文章以 SAP 实施顾问在实施项目中需要掌握的 sql 语句为偏向进行选题: 用例:SAP B1 的数据库工具&am…...
【手术显微镜】市场高度集中,由于高端手术显微镜的制造技术主要掌握于欧美企业
摘要 HengCe (恒策咨询)是全球知名的大型咨询机构,长期专注于各行业细分市场的调研。行业层面,重点关注可能存在“卡脖子”的高科技细分领域。企业层面,重点关注在国际和国内市场在规模和技术等层面具有代表性的企业,…...
IDEA 2024 配置Maven
Step 1:确定下载Apache Maven版本 在IDEA 2024中,随便新建一个Maven项目; 在File下拉菜单栏中,找到Setings; 在Build,Execution,Deployment中找到Maven 确定下载的Apache Maven版本应略低于或等于IDEA绑…...
Admin.NET框架使用宝塔面板部署步骤
文章目录 Admin.NET框架使用宝塔面板部署步骤🎁框架介绍部署步骤1.Centos7 部署宝塔面板2.部署Admin.NET后端3.部署前端Web4.访问前端页面 Admin.NET框架使用宝塔面板部署步骤 🎁框架介绍 Admin.NET 是基于 .NET6 (Furion/SqlSugar) 实现的通用权限开发…...
Flutter中的Future和Stream
在 Flutter 中,Future 和 Stream 都是用于处理异步操作的类,它们都基于 Dart 的异步编程模型,但是它们的使用场景和工作方式有所不同。以下是它们的区别以及各自适用的场景。 目录 一、Future1、基本使用2、异常处理1. catchError2. onError…...
107.【C语言】数据结构之二叉树求总节点和第K层节点的个数
目录 1.求二叉树总的节点的个数 1.容易想到的方法 代码 缺陷 思考:能否在TreeSize函数内定义静态变量解决size的问题呢? 其他写法 运行结果 2.最好的方法:分而治之 代码 运行结果 2.求二叉树第K层节点的个数 错误代码 运行结果 修正 运行结果 其他写法 1.求二…...
spring boot支持那些开发工具?
Spring Boot 支持多种开发工具,以帮助开发者更高效地进行应用开发。以下是小编给大家分享几种常用的开发工具及其特点: IntelliJ IDEA: IntelliJ IDEA 是一款非常流行的 Java IDE,它提供了对 Spring Boot 的全面支持,…...
Go-MediatR:Go语言中的中介者模式
在Go语言中,确实存在一个与C#中的MediatR类似的组件包,名为Go-MediatR。 Go-MediatR是一个受.NET中MediatR库启发的Go语言实现,它专注于通过中介者模式简化命令查询责任分离(CQRS)模式的处理和在事件驱动架构中的应用…...
5.11【机器学习】
先是对图像进行划分 划分完后, 顺序读取文件夹,在文件夹里顺序读取图片, 卷积层又称为滤波器,通道是说滤波器的个数,黑白通道数为1,RGB通道个数为3 在输入层,对于输入层而言,滤波…...
在 CentOS 上安装 Docker:构建容器化环境全攻略
一、引言 在当今的软件开发与运维领域,Docker 无疑是一颗璀璨的明星。它以轻量级虚拟化的卓越特性,为应用程序的打包、分发和管理开辟了崭新的高效便捷之路。无论是开发环境的快速搭建,还是生产环境的稳定部署,Docker 都展现出了…...
Python练习(2)
重复元素判定续。利用集合的无重复性来编写一个程序如果有一个元素出现了不止一次则返回true但不要改变原来列表的值: 一: def has_duplicates(lst): # 使用集合来存储已经见过的元素 seen set() for item in lst: if item in seen: # 如果元素已经在…...
如何实现一套键盘鼠标控制两台计算机(罗技Options+ Flow功能快速实现演示)
需求背景 之前我写过一篇文章如何实现一套键盘鼠标控制两台计算机(Mouse Without Borders快速上手教程)_一套键鼠控制两台电脑-CSDN博客 当我们在局域网内有两台计算机,想使用一套键鼠操控时,可以安装Mouse Without Borders软件…...
现代应用程序中基于 Cell 架构的安全防护之道
在飞速发展的软件开发领域,基于 Cell 的架构日益流行起来。其概念源自船舶舱壁的设计准则,即单独的水密舱室能允许故障孤立存在。通过将这个概念应用于软件,我们创建了一个架构,将应用程序划分为离散的、可管理的组件,…...
【导航查询】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
Xcode 16 集成 cocoapods 报错
基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...
spring boot使用HttpServletResponse实现sse后端流式输出消息
1.以前只是看过SSE的相关文章,没有具体实践,这次接入AI大模型使用到了流式输出,涉及到给前端流式返回,所以记录一下。 2.resp要设置为text/event-stream resp.setContentType("text/event-stream"); resp.setCharacter…...
