首页 > 其他分享 >「学习笔记」严格次短路

「学习笔记」严格次短路

时间:2023-06-13 15:36:40浏览次数:55  
标签:dis1 dis2 ch int 短路 笔记 严格 dijkstra

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

变量

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
模板题 可能次短路就是从这个题开始出现的

#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;
}

标签:dis1,dis2,ch,int,短路,笔记,严格,dijkstra
From: https://www.cnblogs.com/yifan0305/p/17418900.html

相关文章

  • mysql笔记
    1.mysql初始密码修改:进入mysql后,输入:ALTERUSERroot@localhostIDENTIFIEDBY'新密码';2.mysql打开命令:1.mysql-uroot-p,密码;2.mysql-uroot-p密码;3.显示所有数据库:showdatabases;;4.删除数据库:dropdatabase数据库名;;......
  • python入门笔记
     pip批量安装#安装和卸载pipwheel-wpackage_tmp_dir-rrequirement.txtpipdownload-dpackage_tmp_dir-rrequirement.txt#离线下载pipinstall-rrequirement.txtpipuninstallpackage#安装源:pipinstall-ihttps://pypi.douban.com/simple/package_name......
  • 014 数据库学习笔记--查询
    常用查询方式:select*fromtablenameselectcol1,clo2fromtablenamewhereage=18selectcol1,clo2fromtablenamewhere age>=18andage<=60selectcol1,clo2fromtablenamewhere agebetween18and60selecttop(100)col1,clo2fromtablenamewhere ......
  • GoodNotes 5(mac手写笔记软件)
    GoodNotes5mac版是一款非常好用的手写笔记软件,GoodNotes5将会支持使用苹果系统的Mac电脑进行手写,并提供多种不同的笔刷来对字体进行书写。GoodNotes5这款软件采用了非常符合Mac用户习惯的界面,其手写风格和功能完全可以满足日常的记录需求。GoodNotes5在书写方面非常流畅,......
  • 01 卢京潮《自动控制原理》学习笔记转
    原文:https://zhuanlan.zhihu.com/p/262021993先上一份821的考试大纲,四年大学出来的应该都知道课本会将知识点分为重点、一般、掌握、熟练、理解、熟悉、了解等几个等级:正确理解自动控制原理课程中的有关概念。掌握结构图等效变换方法和梅森公式。能根据结构图熟练求取系统的传......
  • 主席树学习笔记
    什么是主席树主席树这个名字看上去很高级,其实不然,它还有另一个名字——可持久化线段树。什么是可持久化可持久化顾名思义就是它可以变得持久,就是我们对他不断进行单点修改后,突然查询它的某一个历史版本,这就叫可持久化。引入例题洛谷3919:可持久化数组题目大意如题,你需要维......
  • node express mvc router 简单目录结构笔记
          只用来参考的  app.jsconstexpress=require('express');constmorgan=require('morgan');consttourRouter=require('./routes/tourRoutes');constuserRouter=require('./routes/userRoutes');constapp=e......
  • ES学习笔记--索引库的操作
    mapping属性mapping是对索引库中文档的约束,常见的mapping属性包括:type:字段数据类型,字符串:text(可分词的文本),keyword(精确值,例如:品牌,国家,IP地址)数值:long,integer,short,byte,double,float布尔:boolean日期:date对象:objectindex:是否......
  • 2023/6/12日学习笔记
    堆在STL中可以用优先队列来构造使用堆std::priority_queue<int,std::vector<int>>q;//大根堆std::priority_queue<int,std::vector<int>,std::greater<int>>q;//小根堆push()     将元素插入优先队列。pop()      将优先级最顶层的元素从......
  • ES学习笔记--IK分词器
    IK分词器的安装:我这里是采用在线安装的方式:#进入容器内部dockerexec-itelasticsearch/bin/bash#在线下载并安装./bin/elasticsearch-plugininstallhttps://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.0/elasticsearch-anal......