最短路

浅说最短路 我们在信息学奥赛中,时常会遇到让我们求图上最短路的问题,之前我们可以敲dfs或bfs,但是这两个一个时间复杂度太大了,一个有限制条件,所以说我们还不如重新研究一个算法,所以这就有了最短路算法。 但是这里有个点值得注意,最短路算法不仅仅可以用于解决最短路,还可以用于解决一些不等式(组)求解的问题,也就是我们经常说的差分约束。友情提示:在学习这篇之前,请先学习图论基础章如果说,我们只想求一个点到另一个点或者说一个点到其他所有点的最短路的话,这也就是在求单源最短路,一般情况下,单源最短路会用两种算法解决,一个是D 阅读详情

算法思想:我们用数组d记录每个结点的最短路径估计值。我们采取的方法是动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止

  建议先看spfa详解: http://blog.youkuaiyun.com/muxidreamtohit/article/details/7894298

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();//顶点数
		int m = sc.nextInt();//边数
		
		int[] num = new int[n+1];//每个顶点边的个数 
		
		Eage[][] eage= new Eage[n+1][m];
		
		for(int i = 0 ; i < m ; i++ ){
			int u = sc.nextInt();//始点
			int v = sc.nextInt();//终点
			int l = sc.nextInt();//权值
			eage[u][num[u]++] = new Eage(v,l);
		}
		
		int[] d = new int[n+1];//最短距离
		init(n, d);//对最小边初始化
		boolean visit[] = new boolean[n+1];//是否在队列中
		spfa(visit, num, d, eage);
		for(int i = 2 ; i <= n ; i++ ){
			System.out.println(d[i]);
		}
	
	}
	public static void spfa(boolean[] visit,int[] num,int d[],Eage[][] eage){
		Queue<Integer> q = new LinkedList<Integer>();
		q.offer(1);//先在队列中插入第一个元素1
		visit[1] = true;
		while(!q.isEmpty()){
			int x = q.poll();//弹出队首元素
			visit[x] = false;
			for(int i = 0 ; i < num[x] ; i++ ){
				if(d[x] != Integer.MAX_VALUE && d[eage[x][i].getTo()]>eage[x][i].getCost()+d[x]){
					d[eage[x][i].getTo()] = eage[x][i].getCost()+d[x];
					if(!visit[eage[x][i].getTo()]){//如果v点不在队列中,就将v点放入队尾。
						q.offer(eage[x][i].getTo());
						visit[eage[x][i].getTo()] = true;
					}
				}
			}
		}
		
	}
	public static void init(int n,int[] d){
		for(int i = 1; i <= n ; i++){
			d[i] = Integer.MAX_VALUE;
		}
		d[1] = 0;
	}
	
	
	
}
class Eage{
	int to;
	int cost;
	public int getTo() {
		return to;
	}
	public void setTo(int to) {
		this.to = to;
	}
	public int getCost() {
		return cost;
	}
	public void setCost(int cost) {
		this.cost = cost;
	}
	public Eage(int to ,int cost) {
		// TODO Auto-generated constructor stub
		this.to = to;
		this.cost = cost;
	}
}








注:在蓝桥杯上跑总是有一部分运行超时。

总结:1、关于图的构建还是太陌生。

    2、Queue的offer()  进队列,poll()出队列(先进先出)   还有一个优先级队列  (http://blog.youkuaiyun.com/hiphopmattshi/article/details/7334487)

   3、(最重要的)spfa算法详解 http://blog.youkuaiyun.com/muxidreamtohit/article/details/7894298,java代码实现http://www.cnblogs.com/dashen/p/3755049.html

最短路问题(五个算法模板) 题目给定一个有向图,图中有 𝑛n 个点和 𝑚m 条边。图中可能存在重边和自环,所有边权均为正值。请你求出从 1 号点到 𝑛n 号点的最短距离。如果无法从 1 号点走到 𝑛n 号点,则输出 -1。 阅读详情

相关推荐

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

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

一个蒟蒻的博客 2001

专题·最短路【including Dijkstra, SPFA,Floyd,传递闭包,二维最短路,分层图最短路,最短路计数……

DIj算法,堆优化版本,线段树优化版本; SPFA算法,Floyd算法,传递闭包; 如标题的各种最短路的应用

樱狸✨愿携清风归来处 1万+

Unity 接入HybridCLR的点点滴滴,亲测三平台(PC、Android、WebGL)妥妥的。-问题分享

一入热更深似海啊,没有热更是真恼火啊,干啥啥不方便,动不动就得重新发包;说实在的,也是工作之余研究这个,在原有框架基础上接入这个热更,既要保持原有功能,还要支持热更,实实在在、断断续续搞了这么久,终于是接入并测通了,这一路是坎坎坷坷,下面把走过的弯弯绕绕记录下,希望对后来想接入的小伙伴有帮助吧。

GarFe的博客 1万+

最短路问题——单源最短路

是的,所以我们上面也说了: Bellman-Ford算法是比较暴力的把所有的边都更新(即先后对所有的顶点的相邻顶点进行松弛),而不像Dijkstra算法的贪心那样每次选的都是最短的,也因此它一遍过后可能得不出最短的路径,可能需要进行多次迭代。

2301_80224556的博客 1556

深空探测处理软件USGS-ISIS的下载安装

深空探测处理软件USGS-ISIS下载安装教程

qq_31721595的博客 3313

在 Linux/Debian/Ubuntu 上使用 Brasero 刻录光盘

在 Ubuntu 系统中,Brasero 是一个非常方便的光盘刻录工具。无论是创建数据光盘、音频光盘还是刻录光盘镜像文件,Brasero 都能轻松胜任。本文将介绍如何在 Ubuntu 上安装和使用 Brasero 进行光盘刻录。

I AM COMING BACK... 3551

最短路问题——多源最短路

当处理到第。

2301_80224556的博客 1581

【SPSS实战】手动实现Quade非参数协方差分析:从数据准备到结果解读

本文详细介绍了在SPSS中手动实现Quade非参数协方差分析的实战方法。当数据不满足正态分布等参数检验假设时,通过将协变量和因变量转换为秩,并利用秩回归残差进行Kruskal-Wallis组间比较,提供了一种清晰、可操作的近似解决方案。该方法有效解决了非正态数据的协变量调整问题,适用于实验研究和调查数据分析。

bean的博客 469

最短路问题(超详细~~)

文章目录最短路问题分类朴素Dijkstra算法 最短路问题分类 最短路算法知识结构图 注:n为顶点数,m为边数 每种不同的情况都有相应最适合的算法,但不用拘泥于一定要用某个算法。 单源最短路:求一个点到其他所有点的最短距离 多源汇最短路:源 指 起点,汇 指 终点。任意两点间的最短距离(起点、终点不确定) 稠密图:m至少和n^2大致是一个级别 (稠密图用邻接矩阵存储) 稀疏图:m至少和n大致是一个级别 (稀疏图用邻接表存储) 重点:建图,如何把原问题抽象成一个最短路问题,如何定义点和边。 朴素Di

灯火阑珊_ 8733

导出库的版本_Windows下PaddleOCR在C++中的推理部署(CPU版本)CMake + VS2017

PaddleOCR是一个与OCR相关的开源项目,不仅支持超轻量级中文OCR预测模型,总模型仅8.6M(单模型支持中英文数字组合识别、竖排文本识别、长文本识别,其中检测模型DB(4.1M)+识别模型CRNN(4.5M)),而且提供多种文本检测训练算法(EAST、DB)和多种文本识别训练算法(Rosetta、CRNN、STAR-Net、RARE)。本文将教大家通过PaddleOCR(CPU版...

weixin_31304817的博客 1915

《网络安全自学教程》- Nmap使用及扫描原理分析

使用Nmap进行端口扫描、主机发现、服务识别、操作系统识别、指定脚本、结果导出文件,使用wireshark抓包分析扫描原理。

wangyuxiang946的博客 1万+

【算法】图论——单源最短路问题

邻接矩阵存储图判断一个顶点是否已经确定最短路的数组从起点到第i个点的距离数组。距离数组中可能暂时存储的不是最短路,具体看上面的判断数组题目链接:邻接表边的权值表距离表判断表,用于判断该顶点是否遍历过堆,使用STL中的priority_queueedges[M]:用于存储所有边,M为边的数量dis[N]:用于存储经过一次松弛操作后的顶点距离backup[N]:dis的拷贝为什么要有backup?

m0_73904148的博客 1935

MongoDB分布式事务实现:两阶段提交、日志复制与冲突解决

MongoDB分布式事务机制解析 本文深入剖析了MongoDB 4.0+版本的分布式事务实现原理,重点分析了其在跨文档/跨集合/跨分片场景下的数据一致性解决方案。核心内容包括: 底层机制:采用改进的两阶段提交协议,通过oplog日志复制实现无中心协调器的事务管理,结合WiredTiger存储引擎和锁机制保障ACID特性。 创新设计:将传统2PC的中心协调功能分散到Primary节点,利用oplog作为事务状态记录,实现自动故障恢复和60秒超时回滚机制。 性能优化:针对大事务、写冲突等常见问题,提出拆分微事务

数据知道的博客 1261

最短路算法

最短路是存在于带权图上的概念最短路算法分为两种:①单源最短路:指定一个起点x,求这个点s到其他是有点的最短路②全源最短路:可以求出任意两个点之间的最短路。

2401_89639725的博客 1361

innovus:streamOut gds中pg text带有冒号(:)解决办法

streamOut后查看layout,发现部分PG text后面加了冒号,比如VDD: / VSS:。当然,这个问题还有另一种解决办法,就是通过脚本给terminal打text再streamOut。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1192

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

第三章 图论 No.2单源最短路之虚拟源点,状压最短路与最短路次短路条数

而spfa的更新不具有拓扑序,即不存在最短路树,要是图中存在负权边,无法使用天然具有拓扑序的bfs和dijkstra时,只能先用spfa求出最短路,维护出最短路树,再求最短路条数。对于spfa,由于它是暴力算法的优化,每个点都会入队与出队多次,所以spfa的更新不具有拓扑序,已经出队(更新完成)的点可能影响被后续入队的点影响。对于BFS,由于每个点只会入队一次且只会出队一次,说明BFS的更新天然地具有拓扑序,因为出队的点不会被后续入队的点影响。这里涉及到二维坐标到一维的转换,然后用邻接表存储图。

凡事都是靠练习 3141

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

图最短路问题

一、图的最短路问题分类 求解最短路问题有很多种解决方案,各个方案会有对应的解决类型 单源最短路问题:BFS用于解决单源无权最短路问题 Dijkstra算法用于解决单源正权最短路问题 Bellman-Ford、SPFA算法用于解决负权最短路问题 各顶点最短路问题:Floyd算法 二、BFS广度优先搜索 1、BFS按照到源点的最短距离将图中的各点分类,按照距离从小到大访问各点。为了实现按距离大小访问各...

qq_43575926的博客 892

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

最短路问题

本篇介绍了最短路问题常用的算法:dijkstra算法、bellman-ford算法、spfa算法、floyd算法

2301_80358171的博客 1114

MATLAB 最短路

本文介绍了 MATLAB 中的最短路问题,以及如何使用 MATLAB 解决最短路问题。

小嗷犬的博客 5209

最短路算法介绍

最短路是一个图论中非常常见的算法,一般是要求图中某两个点的距离或某种计算方式的极值。最短路又分为和,单源最短路就是求某一个节点到所有节点的距离或某种计算方式的值,常见算法有,全源最短路就是要求出任意两个点的距离或某种计算方式的值,常见算法有,具体如下图。

SJY_125的博客 673

【算法】最短路算法

这次为大家分享的是图论中的最短路算法。考虑到最短路算法的复杂性以及本文新手向的教程,本次算法讲解列举了大量例子并且配上了大量动图。篇文章所有的代码实现都是算法向的,以快速实现和效率为主,如果出现算法向的代码实在看不懂,可以参考白晨的工程向实现的代码

白晨的博客 3943

初见最短路!最适合小白的最短路入门!!!(Dijkstra、Floyd)

最短路简明入门教程,内含Dijkstra、Floyd,最适合小白观看!!!

2301_80089588的博客 1281
上一篇: 字母图形
下一篇: jsp传值到servlet中文乱码问题解决
jeffery0628
博客等级 码龄11年 39粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值