分层图最短路
常见情形:
对于边有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 系列【数据事务…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...