「学习笔记」严格次短路

这篇具有很好参考价值的文章主要介绍了「学习笔记」严格次短路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

出题人说:“有最短路,还要有次短路。”
于是,就有了次短路这个东西。
与次小生成树一样,目前不知道有啥用。
本文求的是严格次短路!

变量

n:点数;
m:边数;
evector 存图;
dis1:储存最短路;
dis2:储存次短路。

过程

我们要利用 dijkstra 的贪心思想和松弛操作。
dijkstra 的贪心思想,就是用目前路径最短的点去更新其他点的最短路。
松弛操作,即判断操作。

if (dis1[v] >= dis1[u] + w) {
	dis1[v] = dis1[u] + w;
	q.push({dis1[v], v});
}

求严格次短路,我们先考虑次短路的值是怎么来的。

  • 最短路被更新,原最短路的值转移到次短路上。
  • 新的路径大于最短路的长度,次短路还没有被更新。
  • 新的路径大于最短路的长度,且小于当前次短路的长度。
  • \(u\) 节点的次短路更新后小于 \(v\) 节点当前的次短路。

知道怎么来的了,我们只需要最原来的 dijkstra 代码做出一点小小的修改即可。

priority_queue<pli, vector<pli>, greater<pli> > q;

void dijkstra() {
	for (int i = 1; i <= n; ++ i) {
		dis1[i] = dis2[i] = 1e9 + 5;
	}
	dis1[1] = 0;
	q.push({0, 1});
	while (!q.empty()) {
		int u = q.top().second;
		q.pop();
		for (auto [w, v] : e[u]) {
			if (dis1[v] >= dis1[u] + w) {
				dis1[v] = dis1[u] + w;
				q.push({dis1[v], v});
			}
			else if (dis2[v] > dis1[u] + w) {
				dis2[v] = dis1[u] + w;
				q.push({dis1[v], v});
			}
			if (dis2[v] > dis2[u] + w) {
				dis2[v] = dis2[u] + w;
			}
		}
	}
}

题目

[USACO06NOV]Roadblocks G
模板题 可能次短路就是从这个题开始出现的文章来源地址https://www.toymoban.com/news/detail-481085.html

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, int> pli;

inline ll read() {
	ll x = 0;
	int fg = 0;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		fg |= (ch == '-');
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = (x << 3) + (x << 1) + (ch ^ 48);
		ch = getchar();
	}
	return fg ? ~x + 1 : x;
}

const int N = 5e3 + 5;

int n, m;
ll dis1[N], dis2[N];
vector<pli> e[N];
priority_queue<pli, vector<pli>, greater<pli> > q;

void dijkstra() {
	for (int i = 1; i <= n; ++ i) {
		dis1[i] = dis2[i] = 1e9 + 5;
	}
	dis1[1] = 0;
	q.push({0, 1});
	while (!q.empty()) {
		int u = q.top().second;
		q.pop();
		for (auto [w, v] : e[u]) {
			if (dis1[v] >= dis1[u] + w) {
				dis1[v] = dis1[u] + w;
				q.push({dis1[v], v});
			}
			else if (dis2[v] > dis1[u] + w) {
				dis2[v] = dis1[u] + w;
				q.push({dis1[v], v});
			}
			if (dis2[v] > dis2[u] + w) {
				dis2[v] = dis2[u] + w;
			}
		}
	}
}

int main() {
	n = read(), m = read();
	for (int i = 1, x, y, z; i <= m; ++ i) {
		x = read(), y = read(), z = read();
		e[x].push_back({z, y});
		e[y].push_back({z, x});
	}
	dijkstra();
	printf("%lld\n", dis2[n]);
	return 0;
}

到了这里,关于「学习笔记」严格次短路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于SpringCloud微服务自动出题题库系统设计与实现

    题库是“在计算机系统中,按照教育测试方案进行完成的某课程题目的总和,是在教学研究模型基础上通过建立发展起来的教育测量工具。”完善的题库管理系统可以减轻教师的出卷工作负担,全面系统的给出规范完整的试卷。目前已有众多专家学者在题库系统领域做了大量

    2024年02月11日
    浏览(32)
  • 【操作系统】银行家算法个人出题例题 (含答案)

    1.银行家算法是代表性的避免死锁的算法,在进程调度中具有重要作用。请结合所学知识回答以下问题:(23分——加长版) (1)银行家算法使用的四个必要的数据结构是:可用资源向量Available,____________,分配矩阵Allocation,需求矩阵Need。(1分) (2)以下是银行家算法具体实现

    2024年02月12日
    浏览(33)
  • 在线小学数学作业练习册出题网站源码,支持打印转成PDF

    源码介绍 小学数学出题网页版源码,加减乘除混合运算,支持自定义数字、小数、混合运算,支持加减乘除运算混合多选(一道题中同时随机出现加减乘除运算符)支持自定义出题数量,支持一键打印成pdf,支持隐藏选项功能,打印纯净试卷,小学数学没有负数,保证结果不

    2024年01月25日
    浏览(42)
  • 【加强版】小学数学出题,加减乘除混合运算,支持自定义数字,一键打印

    在线预览:在线HTML代码预览和运行工具 - UU在线工具   复制下面代码后到该地址预览即可  注意: 在线预览不能打印 。如需打印,在电脑本地上新建文本文档,粘贴代码后保存,然后把文件后缀改为.html运行,出题点击打印就可以了 新增功能: 1、支持加减乘除运算混合多

    2024年01月17日
    浏览(46)
  • 某班有最多不超过30人(具体人数由实际输入决定)参加期末考试,最多不超过6门(具体门数由实际输入决定)。

    某班有最多不超过30人(具体人数由实际输入决定)参加期末考试,最多不超过6门(具体门数由实际输入决定)。学生成绩管理系统是一个非常实用的程序,如果能够提前学习字符文件读写操作,把用户输入的数据存盘为字符文件,下次运行时读出,就更有用了。即编程实现

    2024年02月08日
    浏览(31)
  • 数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)

    目录 问题分类  无权图单源最短路径算法 思路 伪代码 时间复杂度 代码实现(C语言) 有权图单源最短路径算法 Dijkstra(迪杰斯特拉)算法 伪代码  时间复杂度  代码实现(C语言) 多源最短路径算法 两种方法 Floyd算法 代码实现(C语言) 最短路径问题的抽象 在网络中,求

    2024年02月08日
    浏览(57)
  • html开启严格模式

    !DOCTYPE html是html5标准网页声明,原先的是一串很长的字符串,现在是这个简洁形式,支持html5标准的主流浏览器都认识这个声明。在 HTML5 中,!DOCTYPE html声明唯一的作用是启用标准模式。 注意,!DOCTYPE 声明位于文档中的最前面的位置,处于 html 标签之前。DOCTYPE是document type(文

    2024年02月20日
    浏览(34)
  • JS的严格模式

    JavaScript的严格模式(Strict Mode)是一种在代码中启用的特殊模式,用于提供更严格的语法和错误检查,以改善代码质量和增强安全性。使用严格模式可以帮助大家避免一些常见的错误,并禁用一些不推荐使用的特性。 要启用严格模式,可以在代码的顶部或函数体的开头添加以

    2024年02月07日
    浏览(31)
  • JavaScript激活严格模式

    在JavaScript中,严格模式是一种特殊的模式,通过’use strict’;去激活严格模式!在 JavaScript 中,“use strict” 是一种指令,表示在代码运行时启用严格模式,从而禁止使用一些不安全或者不规范的语法,减少代码出错的可能性。 看上面的代码,意思如果你通过测试,你可以拿

    2024年02月13日
    浏览(30)
  • 华为OD-非严格递增连续数字序列

    输入一个字符串仅包含大小写字母和数字 求字符串中包含的最长的非严格递增连续数字序列长度 比如: 12234属于非严格递增数字序列 输入一个字符串仅包含大小写字母和数字 输出字符串中包含的最长的非严格递增连续数字序列长度 输入 输出 2234 为最长的非严格递增连续数

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包