最简单的次短路算法

次短路(第二最短路径) 第二最短路径 有句古话叫“不破不立”,这个思想跟次短路也就是第二最短路的思想一样。 算法思想:计算原图的最短路,并保存路径。一一破坏最短路中的每一条边,重新计算最短路,并排序。最小的那个就是第二最短路。 1.用dijkstra计算u->v的最短路径,保存路径上的每条边 2.依次删除最短路径上的每一条边(每次删一条),重新计算新的u->v最短路径(新的最短路>=原最短路) 3.把所有新 阅读详情

我的第一篇博客

(2020-01-01)

第一种方法

步骤
  1. 起点s,终点t;
  2. 找s到每个点的最短路并用dis1数组记下来;
  3. 找t到每个点的最短路并用dis2数组记下来;
  4. 访问每条边,用u表示这条边的起点,v表示这条边的终点,w表示权值,用k记下s到u的最短路加上v到t的最短路再加上w;
  5. 比较k和dis1[ t ]的大小,如果k > dis1[ t ],就与ans比较,如果小于ans,则更新ans的值为k;
  6. 次短路就为ans;

代码如下(1到n的次短路):

#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 5005
#define maxm 200005
#define inf 0x7fffffff
#define ri register int 
using namespace std;
priority_queue<pair<int,int> >q;
int from[maxm];//边的起点 
int to[maxm];//边的终点 
int weight[maxm];//边的权值 
int next[maxm];//下一条边的编号 
int head[maxn];//上一条边的编号 
int vis[maxn];//判断该点是否已经找到最小值 
int dis[maxn]; 
int dis1[maxn];//1到每个点的最短路 
int dis2[maxn];//n到每个点的最短路 
int n,m,t,cnt,k,ans=inf;
inline int read()//快读 
{
	ri x=0,f=1;
	char ch=getchar();
	while(ch>'9'||ch<'0')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
inline void add_edge(int x,int y,int z)//建边 
{
	cnt++;
	from[cnt]=x;
	to[cnt]=y;
	weight[cnt]=z;
	next[cnt]=head[x];
	head[x]=cnt;
}
inline void Dijkstra(int s,int t)
{
	memset(vis,0,sizeof(vis));
	for(ri i=0;i<=n;++i)
		dis[i]=inf;
	dis[s]=0;
	q.push(make_pair(-dis[s],s));
	do
	{
		k=q.top().second;
		q.pop();
		if(vis[k]) continue;
		vis[k]=1;
		for(ri i=head[k];i;i=next[i])//遍历每条边 
		{
			ri v=to[i];
			ri w=dis[k]+weight[i];
			if(w<dis[v]) 
			{
				dis[v]=w;//更新最短路 
				q.push(make_pair(-dis[v],v));
				vis[v]=0;
			}
		}
	}while(q.size());//判断队列是否为空 
}
int main()
{
	n=read(),m=read();
	for(ri i=1,x,y,z;i<=m;++i)
	{
		x=read(),y=read(),z=read();
		add_edge(x,y,z);
		add_edge(y,x,z);
	}
	Dijkstra(1,n);
	for(ri i=1;i<=n;++i)
		dis1[i]=dis[i];
	Dijkstra(n,1);
	for(ri i=1;i<=n;++i)
		dis2[i]=dis[i];
	for(ri i=1;i<=m*2;++i)
	{
		ri u=from[i],v=to[i],w=weight[i];
		ri k=dis1[u]+dis2[v]+w;//1到u的最短路,加上v到n的最短路,再加上w 
		if(k>dis1[n]&&k<ans) ans=k;//更新次短路 
	}
	printf("%d",ans);	
	return 0;
}

第二种方法

  • 同时找最短路和次短路
#include<cstdio>
#include<vector>
#include<queue>
#define maxn 5005
#define maxm 200005
#define ri register int
#define inf 0x7fffffff
using namespace std;
priority_queue<pair<int,int> >q;//定义优先队列 
int to[maxm];//边的终点
int weight[maxm];//边的权值
int next[maxm];//下一条边的编号 
int head[maxn];//上一条边的编号
int dis1[maxn];//1到每个点的最短路 
int dis2[maxn];//1到每个点的次短路 
int n,m,cnt;
inline int read()//快读 
{
	ri f=1,x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
void add_edge(int u,int v,int w)//建边 
{
	to[++cnt]=v;
	weight[cnt]=w;
	next[cnt]=head[u];
	head[u]=cnt;
}
void dijkstra()
{
	dis1[1]=0;
	q.push(make_pair(-dis1[1],1));
	while(!q.empty())
	{
		ri k=q.top().second,ki=-q.top().first;//因为进去的取了相反数,所以出来要添负号 
		q.pop();
		if(dis2[k]<ki) continue;//如果该点的次短路已经比要更新的小了,那么就不需要更新 
		for(ri i=head[k];i;i=next[i])
		{
			ri v=to[i],s=ki+weight[i];
			if(s<dis1[v])
			{
				dis1[v]=s;//更新最短路 
				q.push(make_pair(-dis1[v],v));
			}
			if(s>dis1[v]&&s<dis2[v])//比最短路长并且比次短路短 
			{
				dis2[v]=s;//更新次短路 
				q.push(make_pair(-dis2[v],v));
			}
		}
	}
}
int main()
{
	n=read(),m=read();
	for(ri i=1,x,y,z;i<=m;++i)
	{
		x=read(),y=read(),z=read();
		add_edge(x,y,z);
		add_edge(y,x,z);
	}
	for(ri i=1;i<=n;++i) dis1[i]=dis2[i]=inf;//都赋最大值 
	dijkstra();
	printf("%d",dis2[n]);
	return 0;
}

两道练习题
洛谷P2865
洛谷P2829

次短路 两种做法 洛谷2865 方法一: 解法:通过正向1—n求所有点到点1的距离,然后反响向求出所有点到点n的最短距离。然后我们来枚举每一条边,然后找出D=dis[0][u]+w(u,v)+dis[1][v]比最短路径大的中最小的一个就是次短路径。 原因:因为次短路一定至少有一条边和最短路的不一样,我们通过枚举任意一条边,强制一条路一定从这里过。并且这条路的两个端点到1,N两个点的距离是保证最短的。因此当我们找到次短路跟最... 阅读详情

相关推荐

【图论算法】 最短路,次短路,k短路总结

在图论里,最短路,次短路,k短路的问题很常见。 这里总结一下。 存图技巧 数据小,稠密图的一般用邻接矩阵 稀疏图,数据大一般用邻接表(vector,链式前向星都可) 邻接矩阵 const int maxn = 1e5+5; int Graph[maxn][maxn]; // 正权图可以初始化成-1来判断是否连通,负权图可以再考虑开个数组或者用一个很大的值。 链式前向星 const int max...

一个蒟蒻的博客 1997

次短路(两种方式) && 第K短路

次短路算法: 有两种比较简单实现次短路的思想 方法一:用 dijkstra 算法 从起点开始 同时维护 【最短路数组(dis1[ ])】 和 【次短路 数组 (dis2[ ])】 方法二:还是用到dijkstra 算法 分别用两个 dis1[ ] 数组 和 dis2[ ] 数组 分别 维护 从起点 和 从终点开始 的 最短路 ——然后枚举 所有边 , 将边的两个端点 连上 起点和终点 看是...

我歌月徘徊,我舞影零乱 5873

两种次短路

次短路:最短路外的另一条最短路 两种次短路: 可经过重复顶点。 不可经过重复顶点。 如图所示 1->2->1->2->3 1->3 对于第一种次短路直接再加一个数组一起更新即可。 对于第二种次短路,需要记录下最短路的顶点,然后枚举这条路上的每一个相邻顶点,使得次短路不经过这两点之间的边。 #include <bits/stdc++.h> usin...

Link_Ray的博客 833

最短路问题——K短路问题 / 次短路问题

最短路问题——K短路问题 / 次短路问题。​ 最短路问题中的非常著名的Dijkstra算法、Floyd-Warshall算法以及经典的练习题,大家可以去下面的链接看哈。 Dijkstra算法、Floyd-Warshall算法。A*算法 给定一个图,定义起点𝑠和终点𝑡,以及数字𝑘;求𝑠到𝑡的第𝑘短的路。允许环路。相同长度的不同路径,也被认为是完全不同的。 思路:用A*算法求解。把从𝑠到𝑡的路径分为两部分:从𝑠到中间某个

指北针_N的博客 2031

图论次短路算法:从Dijkstra状态扩展到网络路由应用

在图论与网络优化中,最短路径算法是解决资源最优分配问题的核心基础,Dijkstra算法通过贪心策略高效求解单源最短路径,广泛应用于路由协议与导航系统。其原理在于维护节点距离估计,通过松弛操作逐步收敛至最优解。这一技术价值在于为网络流量调度、物流规划等场景提供了确定性最优解。然而,现实系统对容错性与鲁棒性有更高要求,当主路径失效时,需要快速切换至备用路径,这引出了对次优路径的搜索需求。次短路问题正是对此的建模,其中严格次短路要求路径长度严格大于最短路且路径不同,而非严格次短路则允许长度相等但路径不同。解决严格

weixin_29611239的博客 370

图论算法进阶:严格与非严格次短路的Dijkstra求解与应用

在图论与网络优化领域,最短路算法是解决路径规划、资源分配等问题的基石。其核心原理是通过贪心或动态规划策略,寻找图中两点间成本最低的路径,Dijkstra算法因其高效性成为处理非负权图的经典选择。该技术的工程价值在于为系统提供了确定性的最优决策基础。其应用场景广泛,从网络路由、交通导航到物流调度,都依赖于高效的最短路计算。然而,在实际工程中,仅依赖单一最优路径存在风险,例如链路故障或资源竞争时,系统需要高质量的备用方案。这就自然引出了对次优路径,即次短路的需求。次短路分为严格与非严格两种,前者要求路径长度严格

weixin_30899023的博客 280

次短路小结

次短路有两种计算方法。 方法一、更新最短路时同步更新次短路 对于一条端点为u、v的边,点v的次短路,要么是点u的次短路加边权,要么是点u的最短路加边权。 设两个数组,dist1存储最短路,dist2存储次短路,则存在下面的等式: dist2[v]=min{dist2[u]+wdist1[u]+wdist1[u]+w&amp;gt;dist1[v] dist2[v]=min\left\{ \begi...

教与学 601

华中科技大学计算机组成原理-单总线CPU设计(全部通关)

【计算机组成原理】 单总线CPU实验 华中科技大学-计算机组成原理 实验三 单总线CPU设计 第1关 MIPS指令译码器设计 第2关 单总线CPU微程序入口查找逻辑 第3关 单总线CPU微程序条件判别测试逻辑 第4关 单总线CPU微程序控制器设计 第5关 采用微程序的单总线CPU设计 第6关 现代时序硬布线控制器状态机设计 第7关 现代时序硬布线控制器设计

紫荆鱼的博客 4万+

次短路

次短路:大于最短路的最小路径; 最短路:求法很多,不说了 最短路计数:计算最短路的数量,以dijstra算法解最短路来说,多开一个计数的数组num[N],当我们跟新某一个点时,dis[u]>dis[v]+e[u][v] (u点与v点有路),更新num[u]=num[v]; 如果dis[u]=dis[v]+e[u][v],那就单独更新数量:num[u]+=num[v]; 次短路算法:在...

PL博客 3659

R语言pls包实战:手把手教你用偏最小二乘(PLS)搞定高维数据回归(附完整代码与数据标准化避坑指南)

本文详细介绍了如何使用R语言的pls包进行偏最小二乘(PLS)回归分析,特别针对高维数据回归问题。通过完整的代码示例和数据标准化避坑指南,帮助读者掌握从数据预处理到模型优化的全流程,解决实际应用中的常见问题。

weixin_42662605的博客 350

多雷达协同探测技术研究进展:认知跟踪与资源调度算法

源自:雷达学报作者:易伟 袁野 刘光宏 葛建军 孔令讲 杨建宇雷达是信息感知的千里眼,具有极高的军用和民用价值,广泛应用在防空预警、遥感测绘、反恐维稳等领域[1–5]。雷达信息获取与探测技术也一直是大国竞相抢占的前沿技术,同时是信息科学的重要组成部分。随着科学技术不断进步,先进电子对抗装备的不断问世和广泛列装,雷达的生存与发展正面临日益严峻的挑战。从生存环境上看,雷达面临通信等各类民用电磁干扰以及复杂的军用电磁干扰;从探测对象上看,集群、微弱、隐身、高空、低空等多样化目标的出现也给雷达探测与识别带来困难。

renhongxia1的博客 2783

基于 Dijkstra 最短路算法实现的次短路算法

基于最短路算法实现的次短路算法,实现了同时计算最短路径长和次短路径长

peterJr的博客 1315

手把手教你用Boot-Repair快速修复Ubuntu启动分区缺失(附详细命令行步骤)

本文详细介绍了如何使用Boot-Repair工具快速修复Ubuntu启动分区缺失问题,包括诊断、应急准备、自动修复和手动命令操作。通过grub rescue模式下的关键命令和Boot-Repair的图形界面操作,帮助用户高效解决启动分区故障,确保系统恢复正常运行。

weixin_29229989的博客 563

NOI提高级 图论算法:单源次短路

NOI提高级 图论算法:单源次短路

青少年趣味编程 1132

OpenClaw实战系列01:OpenClaw接入飞书机器人全接入指南 + Ollama本地大模型

通过 OpenClaw + Ollama + 飞书的组合,我们成功搭建了一个完全私有、免费、可定制的AI助理。它不仅能在日常聊天中提供帮助,还能通过OpenClaw强大的“技能”体系,真正去操作你的电脑、管理文件、甚至执行代码。这套方案将数据留在本地,既保证了隐私安全,又锻炼了动手能力。现在,去给你的AI助理添加更多酷炫的技能吧!

PeterPan的博客 1万+

PCL 平面点云的凹多边形边界提取【2025最新版】

平面点云的凹多边形边界提取及边界轮廓线绘制。博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 7183

严格次短路 & 非严格次短路

求次短路的思路都相同,都是把值丢到优先队列里,每次取出最小值将其邻点更新。 如果能更新最短距离的话,肯定更新最短距离,换下来的最短距离递补成次短距离;不能更新最短距离的话,再看能否更新次短距离。 而严格次短和非严格次短的区别就在于:最短距离和次短距离能否更新成相同值。 一、非严格次短路 模型 次短路的长度可以和最短路长度相同,问次短路长度为多少? 思路 定义两个 dist数组,用于存放最短距离和次短距离。 从优先队列里面取出一点 dis,遍历所有邻点 tx: 如果 dis + w 比 tx 的最短距离小

Mr_dimple的博客 1953

【YOLOv11改进 - 特征融合】SDI:多层次特征融合模块,替换contact操作

【YOLOv11改进 - 特征融合】SDI:多层次特征融合模块,替换contact操作

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1771

Roadblocks(次短路spfa算法)

原题连接:http://poj.org/problem?id=3255 Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 24585 Accepted: 8540 Description Bessie has moved to a small farm and sometimes enjoys retur...

Shaosen的博客 880

大模型自我认知微调的实战教程

本文主要介绍了大模型自我认知微调的实战教程,希望对学习大语言模型的同学们有所帮助。微调成功并保留原有能力的截图如下所示: 文章目录 1. 前言 2. 配置环境 2.1 安装虚拟环境 2.2 安装依赖库 3. 实战代码 3.1 配置数据集 3.2 lora微调

herosunly的博客 4万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

每周一算法:单源次短路

Dijkstra算法求最短路和次短路的方案数。

少儿编程乔老师 1367

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

spfa算法求解次短路

题目链接:https://ac.nowcoder.com/acm/contest/7031/F 题意:求图当中从0号节点到n-1号节点的次短路。 思路:在spfa算法上稍改进即可,更新次短路的情况分三种。1、当最短路更新时将次短路的值更新为当前最短路的值(这样保证次短路永远都是大于最短路且是第二小的)。2、次短路正常更新。3、当最短路不更新时,若到u的最短路经过该边到v的距离小于次短路则更新次短路。 代码: #include<bits/stdc++.h> using namespace

qq_43679326的博客 509

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

次短路问题总结

学到现在就做过两道次短路的题。 A*这辈子都不可能学的。两个不同的方法分别是dist2法和删边法。 dist2法 做法就是类似于dist数组那样,再弄一个dist2数组,代表次短路径。 更新的话就要比较多的判断关系,关键的最短路算法判断是这样的: void dijkstra(int s, int t) { memset(dist, 0x3f, sizeof dist); ...

dianshu0741的博客 579

次短路问题

第二短的路,可以利用Dijkstra算法求解次短路。

10247D的博客 470
下一篇: 负环——SPFA判断负环
Robin_w2321
博客等级 码龄7年 28粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Robin_w2321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值