spfa算法(java代码)

news2025/4/25 16:07:40

题目:

851. spfa求最短路 - AcWing题库

输入样例:

3 3

1 2 5

2 3 -3

1 3 4

输出样例:

 2

分析:

先去定义一个class 类似于c++里面的pair 里面有两个变量x, y 因为后面需要用优先队列来处理最短路问题需要指出比较x还是y 因此我们让这个pair类实现 Comparable 接口 实现里面的方法 去指出比较谁 按谁去比较

spfa的思路和dijkstra的代码基本上是一样的 但在st可逆不可以上进行了优化 spfa的st是可逆的,你只要出队列 就把你改为false 进来就改为true

SPFA算法不一样,它相当于采用了BFS,因此遍历到的结点都是与源点连通的,因此如果你要求的n和源点不连通,它不会得到更新,还是保持的0x3f3f3f3f

里面st boolean类型的数组的作用是:表明这个点在(true) 不在(false) 优先队列里面, 要是在的话 我就不加进去了 不在的话 我在把这个点加进去

代码:

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;

/**
 * @Title: spfa
 * @Author FindYou
 * @description:
 */
public class spfa {
    public static int n, m;
    public static int[] h,  ne,  w, e, dis;
    public static boolean[] st;
    public static int idx;
    public static Queue<Pair> q = new PriorityQueue<>();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        h = new int[m + 10];
        ne = new int[m + 10];
        w = new int[m + 10];
        e = new int[m + 10];
        dis = new int[m + 10];
        st = new boolean[n + 10];
        init(); // 初始化 要记得
        
        for(int i = 1; i <= m; ++ i ) {
            int a, b, c;
            a = sc.nextInt();
            b = sc.nextInt();
            c = sc.nextInt();
            add(a, b, c);
        }
        spfa();
        if(dis[n] == 0x3f3f3f3f) {
            System.out.println("impossible");
        } else {
            System.out.println(dis[n]);
        }
    }

    public static void add(int a, int b, int c) {

        e[idx] = b; // 当前这个点是 b
        w[idx] = c; // 这个的权值是c
        ne[idx] = h[a];
        h[a] = idx ++ ;
    }

    public static void init() {
        idx = 0;
        for(int i = 1; i <= n; ++ i ) {
            h[i] = -1;
            dis[i] = 0x3f3f3f3f;
        }
        dis[1] = 0;
    }

    public static void spfa() {
        q.add(new Pair(0, 1)); // 0是距离 1是点了
        st[1] = true;
        while (q.size() != 0 ) {
            Pair t = q.poll();
            int pos = t.y; // 吧这个点给取出来了
            st[pos] = false; // 那么就标记为false
            for(int i = h[pos]; i != -1; i = ne[i]) {
                int j = e[i];
                if(dis[j] > dis[pos] + w[i]) {
                    dis[j] = dis[pos] + w[i];
                    if(!st[j]) {
                        st[j] = true;
                        q.add(new Pair(dis[j], j));
                    }
                }
            }
        }
    }
}

class Pair implements Comparable<Pair>{
    int x;
    int y;
    public  Pair(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public Pair() {
    }

    @Override
    public int compareTo(Pair o) {
        if(this.x != o.x) {
            return this.x - o.x;
        } else {
            return this.y - o.y;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1588046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IP广播对讲系统停车场解决方案

IP广播对讲系统停车场解决方案 一、需求分析 随着国民经济和社会的发展&#xff0c; 选择坐车出行的民众越来越多。在保护交通安全的同时&#xff0c;也给停车场服务部门提出了更高的要求。人们对停车场系统提出了更高的要求与挑战&#xff0c; 需要停车场系统提高工作效率与服…

如何在CentOS7.x上生成自签名SSL证书

在配置HTTPS连接时&#xff0c;SSL证书是确保数据传输安全性的关键组件。自签名证书是一种不通过证书颁发机构&#xff08;CA&#xff09;签发的证书&#xff0c;适用于测试和内部使用。以下是在CentOS 7.x系统上生成自签名证书的详细步骤。 1. 安装OpenSSL OpenSSL是一个强大…

时间案例-倒计时

需求 休息日例子 自定义日期类MyDate 日期记录是否是休息日记录是否是周末 Data NoArgsConstructor AllArgsConstructor public class MyDate {// 日期LocalDate date;// 是否休息boolean isRest;// 是否是周末boolean isWeekend; }starter启动器 // 1. 定义起始的休息时间 202…

婚纱摄影从入门到精通,专业婚礼摄影实战指南

一、资料描述 本套婚纱摄影资料&#xff0c;大小543.64M&#xff0c;共有15个文件。 二、资料目录 《婚礼摄影实战指南》苏盛鑫.全彩版.pdf 《婚礼摄影幸福攻略》.pdf 《婚纱摄影8问-拍婚纱照注意事项》【新人必看】.pdf 《婚纱摄影摆姿》 Wedding Posing.pdf 《婚纱摄影…

ELK 企业级日志分析 ELFK

一 ELK 简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源 工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 1 ElasticSearch&#xff1a; 是基于Lucene&#xff08;一个全文检索引擎的…

FPGA核心板在声呐系统中的应用

前言 声纳系统使用声脉冲来探测、识别和跟踪水下物体。一个完整的声纳系统是由一个控制和显示部件、一个发射器电路、一个接收器电路和同时能作为发射装置&#xff08;扬声器&#xff09;和探测装置&#xff08;高灵敏度麦克风&#xff09;的传感器组成。 声纳系统图 技术挑战…

2024 年第十四届 Mathorcup 数学应用挑战赛题目C 题 物流网络分拣中心货量预测及人员排班完整思路以及源代码分享,仅供学习

电商物流网络在订单履约中由多个环节组成&#xff0c;图1是一个简化的物流网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包裹按照不同流向进行分拣并发往下一个场地&#xff0c;最终使包赛到达消费者手中。分拣中心管理效率的提升&#xff0c;对整…

快速开始vue3

版本 node (20.11.1)vue3 (3.4.21) 脚手架创建项目并运行 安装脚手架并创建项目 npm create vuelatest这一指令将会安装并执行 create-vue&#xff0c;它是 Vue 官方的项目脚手架工具 2&#xff09; 安装以下进行选择 ## 配置项目名称 √ Project name: vue3_test ## 是否…

【日常记录】【JS】styled-components库的原理,模板字符串调用函数

文章目录 1、引言2、模板字符串调用函数3、实现 1、引言 在react 中&#xff0c;styled-components 是最流行的 css in js 模式的库 2、模板字符串调用函数 let stu {name: 呆呆狗,age: 30,address: 中国}let str fn你好${stu.name}今年${stu.age}岁,来自${stu.address}这样会…

高创新 | Matlab实现OOA-CNN-GRU-Attention鱼鹰算法优化卷积门控循环单元注意力机制多变量回归预测

高创新 | Matlab实现OOA-CNN-GRU-Attention鱼鹰算法优化卷积门控循环单元注意力机制多变量回归预测 目录 高创新 | Matlab实现OOA-CNN-GRU-Attention鱼鹰算法优化卷积门控循环单元注意力机制多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现OOA…

C语言 | Leetcode C语言题解之第22题括号生成

题目&#xff1a; 题解&#xff1a; // 回溯法求解 #define MAX_SIZE 1430 // 卡特兰数: 1, 1, 2, 5, 14, 42, 132, 429, 1430 void generate(int left, int right, int n, char *str, int index, char **result, int *returnSize) {if (index 2 * n) { // 当前长度已达2nre…

在 Keil 中使用 STM32CubeProgrammer

1. 前言 STM32 MCU 新产品的早期用户有时候会遇见工具链还在完善中的情形&#xff0c;例如&#xff0c;一部分STM32 工具已经支持该产品&#xff0c;而另外一部分 STM32 工具还在更新中。具体到 Keil 用户&#xff0c;用户有可能可以使用 STM32CubeProgrammer 进行下载&#x…

【C++进阶】C++异常详解

C异常 一&#xff0c;传统处理错误方式二&#xff0c;C处理的方式三&#xff0c;异常的概念四&#xff0c;异常的使用4.1 异常和捕获的匹配原则4.2 函数调用链中异常栈展开匹配原则4.3 异常的重新抛出&#xff08;异常安全问题&#xff09;4.4 RAII思想在异常中的作用 五&#…

【ROS2笔记一】ROS2的基本组件

1.ROS2的基本组件 与ROS1类似的&#xff0c;ROS2也具有node&#xff0c;topic&#xff0c;service&#xff0c;action之类的组件&#xff0c;并且也具有rqt等工具。 可以像使用ROS1的命令行的方式&#xff08;参这里【ROS学习笔记7】ROS中的常用命令行&#xff09;&#xff0…

Python机器学习学习线路

随着人工智能技术的飞速发展&#xff0c;机器学习已经成为计算机科学领域的热门话题。Python&#xff0c;作为一门功能强大且易于上手的编程语言&#xff0c;成为学习机器学习的理想选择。本文将为您介绍一条Python机器学习的学习线路&#xff0c;帮助您逐步掌握机器学习的基础…

小程序 SSL证书的重要性与选择

随着移动互联网的迅猛发展&#xff0c;微信小程序已成为众多企业和开发者连接用户的重要平台。然而&#xff0c;随之而来的是对数据安全和隐私保护的严峻挑战。在这一背景下&#xff0c;小程序SSL证书的作用变得尤为重要&#xff0c;它为小程序提供了一个安全的通信管道&#x…

神策PRO PCIe 5.0 SSD发布,光威白菜级定价,打破海外品牌价格壁垒

记得去年DDR5刚刚流行的时候&#xff0c;光威就推出了不少平民价位的DDR5内存产品&#xff0c;加速了DDR5内存的普及&#xff0c;最近光威再接再厉&#xff0c;又拿出了神策PRO PCIe 5.0 SSD&#xff0c;这一举措不仅展现了企业的创新实力&#xff0c;看来是又要来普及PCIe 5.0…

蓝桥杯 — — RSA解密

RSA解密 友情链接&#xff1a;RSA解密 题目&#xff1a; 思路&#xff1a; 对于这道题目&#xff0c;给出了三个已知量n d C&#xff0c;要我们进行解密&#xff0c;对于解密的公式 X C e m o d n X C^e \mod n XCemodn来讲&#xff0c;我们有唯一的参数e是未知的&#xf…

标定系列——Ubuntu18.04下opencv-4.5.3与opencv_contrib-4.5.3源码编译(二十)

Ubuntu18.04下opencv-4.5.3与opencv_contrib-4.5.3源码编译 说明下载安装步骤1.更新2.安装必要的依赖包3.下载源码包并解压4.终端运行如下命令5.添加配置路径6.验证安装是否成功 说明 Ubuntu18.04下对opencv-4.5.3与opencv_contrib-4.5.3源码编译 下载 CSDN下载 安装步骤 …

Qt创建基于应用程序的插件

应用程序插件 什么是插件插件的好处插件的种类应用程序插件创建应用程序的插件步骤:创建测试插件的应用程序步骤:应用程序插件示例开发环境创建示例生成插件运行结果总结什么是插件 插件是一种用于应用程序功能扩展和增强,且按照特定规范编写的应用程序接口的程序。 插件的…