最短路

浅说最短路 我们在信息学奥赛中,时常会遇到让我们求图上最短路的问题,之前我们可以敲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万+

Win10+pycharm+conda 配置Siammask 过程记录(新手向)

我们跑动demo 需要配置两个相关的文件这两个文件需要用 git 进行下载,对于不熟悉git的小伙伴 我这里给出连接,大家可以直接下载即可,并将其配置在 experiments文件夹下然后大家再需要在设置参数参数这里给出了。

C1137577723的博客 551

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

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

2301_80224556的博客 1556

利用Android系统漏洞实现后台弹窗(外弹)

关键:从 Android 8.0(API 26)开始,禁止使用 context.sendBroadcast() 发送隐式广播(即没有指定 setPackage() 或明确组件的广播)。demo核心代码展示利用Android显示系统和广播系统的漏洞实现在后台弹窗的功能,支持最新Android15,16版本。核心功能都是在so层去做,大量使用了jni反调, 如果要上架到应用市场,需要对代码做进一步混淆,加固以应对市场安全扫描。3,开启虚拟显示窗口,这是个透明像素窗口。5,可开启一个线程,调用这个外弹窗口。

2018,再出发~ 1316

Sinutrain下载安装与开启OPC UA---kalrry

Sinutrain 开启 OPC UA 本教程只适用于版本,其他版本配置目录有所改变建议安装到默认路径,否则后期修改路径时候容易忽略细节本教程提供安装包为官方包,网上有些非官方包安装后容易出现授权问题,比如授权管理器无法启动,官方技术会建议你重装系统,很多时候是因为安装包非官方包在首次安装前,建议重启一遍系统。

kalrry 1万+

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

当处理到第。

2301_80224556的博客 1581

Xilinx Aurora 8B/10B IP核详解和仿真

Xilinx Aurora 8b/10b IP核的详解,以及使用与仿真示例,对IP核的配置和如何仿真有非常详细的说明,除了对IP核官方文档的内容进行了解析以外,还对GTX引脚的选择等比较容易混淆和不好理解的地方进行了说明。最后对IP核的仿真运行进行了STEP BY STEP 的说明,对仿真的结果也进行了简要的说明。 该文档对Xilinx FPGA和ZYNQ SOC下 AURORA 8B/10B IP核的使用提供了一个快速上手的指导。

weixin_43354598的博客 1万+

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

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

灯火阑珊_ 8733

使用CLion在Window端进行linux开发

        以往不管是开发x86端linux程序还是arm端linux程序,都是使用Source Insight作为源码编辑工具的,如下图      去年底,发现CLion的2018.3更新版本,可以支持remote host开发了,大爱!     我是基于以下几点原因,将开发工具换成CLion 1. 语法高亮较明显、跳转、重构方便(我很看重这个); 2. 可以使用图形界面进行调...

alist的笔记专栏 1万+

【顾邦小讲堂】第二十四期 电源环路测试从入门到精髓:一文掌握环路测试原理与电压注入点选择依据

电源环路测试是评估开关电源、线性电源等闭环系统稳定性的核心手段,直接关系到电源的稳定性、输出精度、动态响应、抗干扰能力甚至可靠性

GBupupup的博客 2120

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

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

m0_73904148的博客 1935

VTK在QT与非QT环境下使用的区别

VTK可以在QT框架内使用,也可以独立于QT使用,这两种使用方式在架构、交互和渲染方面有显著差异。

深之JohnChen的专栏 630

最短路算法

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

2401_89639725的博客 1361

把审批体验做成一体化:SAP Business Workflow 里的 Secondary Method、Before Method 与 After Method

摘要:SAP Business Workflow 中,Task 的 Secondary、Before 和 After 三类方法对提升审批体验和可追溯性至关重要。Secondary Method 可自动展示辅助信息(如审批时弹出排班报表),但需注意其独立会话特性;Before Method 适合预处理和审计留痕;After Method 确保收尾动作可靠执行。三类方法按特定顺序调用,且错误不影响主流程。合理使用这些方法能减少事务码切换,增强审计能力,优化用户体验。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 191

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

凡事都是靠练习 3141

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

图最短路问题

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

qq_43575926的博客 892

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

最短路问题

本篇介绍了最短路问题常用的算法: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、付费专栏及课程。

余额充值