Acwing851.spfa求最短路(spfa)

news/2024/12/22 13:13:45/

题目

给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。
请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出impossible。数据保证不存在负权回路。

输入格式

第一行包含整数n和m。
接下来m行每行包含三个整数x,y,z,表示点x和点y之间存在一条有向边,边长为z。

输出格式

输出一个整数,表示1号点到n号点的最短距离。如果路径不存在,则输出"impossible”。

数据范围

1 ≤ n , m ≤ 1 0 5 1 \le n,m \le 10^5 1n,m105,
图中涉及边长绝对值均不超过10000。

  • 输入样例:
3 3
1 2 5
2 3 -3
1 3 4
  • 输出样例:
2

题解

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;/*** @author akuya* @create 2023-07-06-19:36*/
public class spfa {static int N=100010;static int n,m,idx;static int x,y,z;static int h[]=new int[N];static int e[]=new int[N];static int ne[]=new int[N];static int w[]=new int[N];static int dist[]=new int[N];static boolean st[] =new boolean[N];public static void main(String[] args) {Scanner scanner=new Scanner(System.in );n=scanner.nextInt();m=scanner.nextInt();Arrays.fill(h,-1);while(m--!=0){x=scanner.nextInt();y=scanner.nextInt();z=scanner.nextInt();add(x,y,z);}int ans=spfa();if(ans==-1) System.out.println("impossible");else System.out.println(ans);}public static int spfa(){Arrays.fill(dist,0x3f3f3f);dist[1]=0;Queue<Integer> queue=new LinkedList();queue.add(1);st[1]=true;while(!queue.isEmpty()){int t=queue.poll();st[t]=false;for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(dist[j]>dist[t]+w[i]){dist[j]=dist[t]+w[i];if(!st[j]){queue.add(j);st[j]=true;}}}}return dist[n]==0x3f3f3f?-1:dist[n];}public static void add(int a, int b ,int c){e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++;}}

思路

spfa用于处理带负权的最短路,即使不带负权,大多数求最短路的题目都可以用spfa求解,很好用。求最短路思路与Dijkstra相似。但dijkstra算法的思想是每次找最短路,spfa的思想是不断对边进行松弛处理。并不需要每次找到最小,也就是没有试用贪心,便可处理负权。但同时也舍弃了速度。时间复杂度为(MN)


http://www.ppmy.cn/news/768092.html

相关文章

液滴接触角边界曲线识别—巧用Ovito

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 更 多 \color{blue}{多} 多 精 \color{orange}{精} 精 彩 \color{green}{彩} 彩&#xff01; 主要专栏内容包括&#xff1a; †《LAMMPS小技巧》&#xff1a; ‾ \textbf…

c语言如何实现被关注自动回复

要在C语言中实现被关注自动回复的功能&#xff0c;你需要考虑以下几个步骤&#xff1a; 1.监听用户输入&#xff1a;在C语言中&#xff0c;你可以使用标准输入函数&#xff08;如scanf&#xff09;来获取用户的输入。你可以使用一个循环来持续监听用户输入。 2.设置关注关键词…

扩计算机内存,如何扩大电脑内存

如何扩大电脑内存 导语&#xff1a;电脑用久了&#xff0c;很有可能出现内存不足的情况&#xff0c;下面小编教大家如何给电脑扩大内存&#xff0c;欢迎参考! 步骤一&#xff1a;右击计算机&#xff0c;选择管理——磁盘管理。 选择磁盘管理的目的是用来查看我们的电脑那个磁盘…

电脑内存扩容

笔记本4G内存&#xff0c;开了几个软件&#xff0c;内存就占满了&#xff0c;很早买的&#xff0c;没用过几次&#xff0c;卖了没必要&#xff0c;偶然间看到内存扩容&#xff0c;研究一下 1.查询你的电脑支持最大内存 硬件操作系统&#xff1d;决定支持的最大内存&#xff1b…

电脑升级之“内存”

很早以前就打算对电脑的内存进行升级了&#xff0c;特别是加了一个拓展屏之后&#xff0c;内存就更加的不够用了&#xff0c;但是一直拖到了现在才进行升级。前几天去京东买了两个金士顿的8G的内存条&#xff0c;今天刚刚安装上去&#xff0c;效果不错&#xff0c;觉得挺值得的…

怎么升级计算机内存容量,怎么样升级电脑内存

怎么样升级电脑内存 这里所说的电脑内存是电脑的运行内存&#xff0c;电脑运行内存的大小影响着电脑运行时的流畅度&#xff0c;怎么样才能提高自己的电脑内存呢?下面是小编为大家整理的怎么样升级电脑内存相关内容&#xff0c;欢迎参考~ 调整高速缓存区域的大小 所谓高速缓存…

人人开源启动错误—找不到符号

1、问题现象 2、分析原因 大概查了一下&#xff0c;主要是lombok版本太低&#xff0c;springboot等环境过高&#xff0c;maven缓存问题&#xff0c;idea缓存问题。 但几个问题我都处理过&#xff0c;都行不通。可能我的问题不在这吧。 3、解决办法 添加&#xff1a;-Djps.tr…

Ghatgpt正式登录苹果手机应用商城,并支持Siri和快捷指令

根据最新信息&#xff0c;OpenAI 发布的 ChatGPT 官方 iOS 应用程序迎来了重大更新。该应用程序已经在上个月登陆了美国、英国、法国、德国和韩国等 App Store&#xff0c;并且成为该市场上最受欢迎的免费应用程序。 作为生产力类应用的领导者&#xff0c;该应用程序完全免费&a…