CF1473E Minimum Path 题解(最短路,分层图最短路,较重要的套路)

news2024/12/25 14:24:32

题目描述:

在这里插入图片描述
题目

分析:

         题目是要让我们求从 1 1 1 出发,到 i i i 的路径的最小权值。其中路径的权值定义为 路径上所有的边权和 减去最大边权 加上最小边权。这里有一个很秒的转化:可以把一条路径的权值理解为 必须将路径上的任意一条边不算代价,任意一条边算 2 2 2 倍代价,问起点到终点的最小路径权值。在这样的理解下,最小权值一定是减去最大边权 加上最小边权,因此这样的转化是正确的。

         这样我们就把 对两条极值边的贡献方式转化成了所有边的贡献方式。看起来更加统一,也更好处理了。

         对于这种 k k k 次机会改变边权 的最短路问题,都可以用 分层图最短路 解决。对于本题,由于 这两种特殊代价没有先后顺序,因此我们需要建 4 4 4 层图:每层图内正常边权,第一层图向第二层图连边权为 0 0 0 的边,第一层图向第三层图连边权为 2 × w 2 \times w 2×w 的边,第二层图向第四层图连边权为 2 × w 2\times w 2×w 的边,第三层图向第四层图连边权为 0 0 0 的边。

         有一个细节需要注意:查询答案时需要询问第一层和第四层较小的答案。这是因为一条路径只有一条边时第四层图中的答案会偏大,这是由于走了多余的边导致的。而由于 m a x max max m i n min min 相等,所以正好抵消,第一层的答案时正确的。对于不止有一条边的路径,显然第四层的答案会更优,因此也满足题意。

CODE:

// 首先将问题转化:-max +min 转化为可以将任意一条边不算权值,将任意一条边权值计算两次取最优,这样的话最优答案一定是减去 max 加上 min 
// 这样对两条极值边的限制就转化为了对所有边的限制
// 这样就变成了分层图的板子 
// 需要注意的是这两种操作的顺序是任意的,因此建图时必须将两种可选择的顺序都体现出来
// 建图:第一层->第三层 2w  第一层->第二层 0  第三层->第四层 0  第二层->第四层 2w 
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
const int M = 2e5 + 10;
typedef long long LL;
int n, m, u, v, head[N * 4], tot;
LL w, dis[N * 4];
struct edge {
	int v, last; LL w;
}E[M * 8 * 2];
void add(int u, int v, LL w) {
	E[++ tot].v = v;
	E[tot].last = head[u];
	E[tot].w = w;
	head[u] = tot;
}
bool vis[N * 4];
struct state {
	int x; LL w;
	friend bool operator < (state a, state b) {
		return a.w > b.w;
	}
};
priority_queue< state > q;
void dijkstra(int s) {
	memset(dis, 0x3f, sizeof dis);
	dis[s] = 0; q.push((state) {s, dis[s]});
	while(!q.empty()) {
		state t = q.top(); q.pop();
		int x = t.x; LL w = t.w;
		if(vis[x]) continue;
		vis[x] = 1; 
		for(int i = head[x]; i; i = E[i].last) {
			int v = E[i].v; LL w = E[i].w;
			if(dis[v] > dis[x] + w) {
				dis[v] = dis[x] + w;
				q.push((state) {v, dis[v]});
			}
		}
	}
}
int main() {
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= m; i ++ ) {
		scanf("%d%d%lld", &u, &v, &w);
		for(int j = 0; j <= 3; j ++ ) {
			add(u + n * j, v + n * j, w);
			add(v + n * j, u + n * j, w);
		}
		add(u, v + n * 2, 2LL * w); add(v, u + n * 2, 2LL * w);
		add(u, v + n, 0); add(v, u + n, 0);
		add(u + n, v + n * 3, 2LL * w); add(v + n, u + n * 3, 2LL * w);
		add(u + n * 2, v + n * 3, 0); add(v + n * 2, u + n * 3, 0);
	}
	dijkstra(1);
	for(int i = 2; i <= n; i ++ ) 
		printf("%lld ", min(dis[i], dis[i + 3 * n]));
	return 0;
}

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

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

相关文章

【面试八股总结】单例模式实现详解

一、基本概念 单例设计模式是⼀种确保⼀个类只有⼀个实例&#xff0c;并提供⼀个全局访问点来访问该实例的创建模式。 关键概念&#xff1a; 一个私有构造函数&#xff1a;确保只能单例类自己创建实例一个私有静态变量&#xff1a;确保只有一个实例&#xff0c;私有静态变量用…

IDEA自动把接口中的方法注解填充到实现类中,勾选Copy JavaDoc即可

1. 目的 有一个Image接口类&#xff0c;接口中有getUserById方法&#xff0c;方法上有注释&#xff0c;实现类ImageImpl实现Image中的方法时&#xff0c;自动把接口中方法的注释也给带下来 具体案例如下 2. 接口类 有一个getUserById方法&#xff0c;方法上面有注释 3. 实现…

Java常用的API_02(正则表达式、爬虫)

Java正则表达式 七、正则表达式7.1 格式7.1.1 字符类注意字符类示例代码1例2 7.1.2 预定义字符预定义字符示例代码例2 7.1.3 区别总结 7.2 使用Pattern和Matcher类与直接使用String类的matches方法的区别。&#xff08;1&#xff09; 使用Pattern和Matcher类示例代码 &#xff…

JVM 之对象的结构与创建

1.对象的创建 1.1类加载 当Java 虚拟机遇到一条字节码 new 指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到 一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有&#xff0c;那 必须先执行相应的类加载过…

昇思MindSpore学习总结十五 ——基于Mindspore 实现BERT对话情绪识别

1、环境配置 根据实际情况&#xff0c;选择合适版本。 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc…

用node.js写一个简单的图书管理界面——功能:添加,删除,修改数据

涉及到的模块&#xff1a; var fs require(‘fs’)——内置模块 var ejs require(‘ejs’)——第三方模块 var mysql require(‘mysql’)——第三方模块 var express require(‘express’)——第三方模块 var bodyParser require(‘body-parser’)——第三方中间件 需要…

华为HCIP Datacom H12-821 卷38

1.多选题 下面关于 BGP中的公认属性的描述&#xff0c;正确的是 A、公认必遵属性是所有BGP路由器都识别&#xff0c;且必须存在于Updata消息中心 B、BGP必须识别所有公认属性 C、公认属性分为公认必遵和可选过渡两种 D、公认任意属性是所有BGP造由器都可以识别&#xff0c…

217.贪心算法:加油站(力扣)

代码解决 class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int curtotol 0; // 当前累积油量int tatol 0; // 总的油量减去总的花费油量int start 0; // 起始加油站的索引// 遍历所有加油站for (int i 0; i &…

【Android面试八股文】你说ARouter采用APT技术,那么谈一下你对APT技术的理解,还有那些框架是采用APT技术呀?JavaPoet

一、谈一下你对APT技术的理解 1.1 对APT技术的理解 APT(Annotation Processing Tool)是一种在编译期间处理注解的技术,它允许开发者在编译时扫描和处理 Java 源代码中的注解信息,生成额外的源代码、资源文件或者其他文件。以下是对APT技术的一些理解和应用场景: 工作原理…

期货量化交易客户端开源教学第九节——新用户注册

一、新用户注册界面设计&#xff1a; 注册时采用手机号注册&#xff0c;客户端发送新号注册申请由后台做审核&#xff0c;后台审核通过后向注册的手机号发送注册成功的消息。注册过的手机号不能再二次注册。 界面验证代码 private{ Private declarations }FVerf: AnsiString; …

【React Native】做了一个简约的雷达图组件

本文目录 【React Native】做了一个简约的雷达图组件获取组件实现思路用法示例简易用法自定义美化 结语 【React Native】做了一个简约的雷达图组件 最近在使用 react-native 中需要绘制雷达图&#xff0c;没有找到合适的小组件&#xff08;大的图表库未直接提供&#xff0c;需…

【活动预告】Apache IoTDB TsFile 智慧能源应用“上会”啦!

2024 年&#xff0c;站在中国数字经济产业升级和数据要素市场化建设的时代交汇点上&#xff0c;为进一步推动全球数据库产业进步&#xff0c;由中国通信标准化协会、大数据技术标准推进委员会主办的“2024 可信数据库发展大会”将于 2024 年 7 月 16-17 日&#xff0c;在北京朝…

Mac M1安装配置Hadoop+Flink SQL环境

Flink 1.18.1 Hadoop 3.4.0 一、准备工作 系统&#xff1a;Mac M1 (MacOS Sonoma 14.3.1) JDK&#xff1a;jdk1.8.0_381 &#xff08;注意&#xff1a;尽量一定要用JDK8&#xff0c;少用高版本&#xff09; Scala&#xff1a;2.12 JDK安装在本机的/opt/jdk1.8.0_381.jdk/C…

海外ASO:iOS与谷歌优化的相同点和区别

海外ASO是针对iOS的App Store和谷歌的Google Play这两个主要海外应用商店进行的优化过程&#xff0c;两个不同的平台需要采取不同的优化策略&#xff0c;以下是对iOS优化和谷歌优化的详细解析&#xff1a; 一、iOS优化&#xff08;App Store&#xff09; 1、关键词覆盖 选择关…

【公益案例展】中国电信安全大模型——锻造安全行业能量转化的高性能引擎...

‍ 电信安全公益案例 本项目案例由电信安全投递并参与数据猿与上海大数据联盟联合推出的 #榜样的力量# 《2024中国数智产业最具社会责任感企业》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 以GPT系列为代表的大模型技术&#xff0c;展现了人工智能技术与应…

Macos 远程登录 Ubuntu22.04 桌面

这里使用的桌面程序为 xfce, 而 gnome 桌面则测试失败。 1,安装 在ubuntu上&#xff0c;安装 vnc server与桌面程序xfce sudo apt install xfce4 xfce4-goodies tightvncserver 2&#xff0c;第一次启动和配置 $ tightvncserver :1 设置密码。 然后修改配置&#xff1a…

3d为什么删掉模型不能返回?---模大狮模型网

在展览3D模型设计行业中&#xff0c;设计师们经常面临一个关键问题&#xff1a;一旦删除了模型的某些部分&#xff0c;为什么很难或者无法恢复原始状态?这不仅是技术上的挑战&#xff0c;更是设计过程中需要深思熟虑的重要考量。本文将探讨这一问题的原因及其在实际工作中的影…

传输层协议之UDP

1、端口号 我们在应用层创建的套接字&#xff0c;是需要通过bind()接口绑定我们的IP地址与端口号的&#xff0c;这是因为数据从传输层向上交付到应用层时&#xff0c;需要用端口号来查找特定的服务进程。一般在网络通信时&#xff0c;用IP地址标识一台主机&#xff0c;用端口号…

查找PPT中某种字体的全部对应文字

本文章的目的是找到某种字体的文字&#xff0c;而不是替换某种字体的文字&#xff0c;也不是将某种字体全部替换为另外一种文字。 第一步&#xff1a;在PPT中按下ALTF11 出现以下窗口 第二步&#xff1a;点击插入->模块 第三步&#xff1a;将以下代码输入到窗体中 Sub F…

【备战秋招】——算法题目训练和总结day4

【备战秋招】——算法题目训练和总结day4&#x1f60e; 前言&#x1f64c;Fibonacci数列我的题解思路分享代码分享 单词搜索我的题解思路分享代码分享 杨辉三角我的题解思路分享代码分享 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢…