spfa()算法(求最短路)

news2025/4/8 7:43:17

spfa算法是对bellman_ford算法的优化,大部分求最短路问题都可以用spaf算法来求。

注意:

(1)如若图中有负权回路,不能用spfa算法,要用bellman_ford算法;若只有负权边,则可以用

spfa算法

(2)Dijikstra算法适用于图中全都是正权边

spfa算法 

step1:

初始化

step2:

取出队头结点,弹出队头,遍历队头结点的子结点,更新距离

step3:

如若第一次更新距离(st[j] == false),将结点编号加入队列。

step4:

重复循环,直至队列没有结点编号,说明到头了。

题目如下:

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。

请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 impossible

数据保证不存在负权回路。

输入格式

第一行包含整数 n 和 m。

接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式

输出一个整数,表示 1 号点到 n 号点的最短距离。

如果路径不存在,则输出 impossible

数据范围

1≤n,m≤105,
图中涉及边长绝对值均不超过 10000。

解答代码如下:

//主要解决三个问题:
//(1)st数组有啥用:if(st[j] == true)//提高速度//处理重边
//(2)用spfa时,为啥图中不能有负权回路:模拟一遍就会了,因为while(q.size())
//(3)为什么要用队列?
#include<iostream>
#include<cstring>
#include<queue>

using namespace std;

const int N = 100010;

int n,m;
int e[N],ne[N],h[N],idx,w[N];
int dist[N];
bool st[N];

void add(int a,int b,int c)
{
    e[idx] =b;
    w[idx] = c;
    ne[idx] = h[a];
    h[a] = idx;
    idx++;
}

int spfa()
{
    memset(dist,0x3f,sizeof(dist));
    dist[1] = 0;
    
    queue<int > q;
    q.push(1);//队列q中存储的是上一次循环被确定最短路径长度的结点编号
    
    st[1] = true;//st数组中存储的是此时编号 i 结点是否在队列中
    
    while(q.size())
    {
        int t = q.front();
        q.pop();//q中只存储上一次循环中被确定最短路径长的结点的编号,再上一次的会被弹出
        
        st[t] = false;
        
        for (int i = h[t];i != -1;i = ne[i])
        {
            int j =e[i];
            
            if (dist[j] > dist[t] + w[i])//通过if语句判定,说明编号 j 结点需要更新
            {
                dist[j] = dist[t] + w[i];
                
                if (!st[j])//判断q会不会出现重复的结点
                {
                    q.push(j);//如果这个结点的距离是第一次被更新(初始值都是0x3f3f3f3f)
                              //那么就进入队列,在下一次循环中,q队列中存储的就是上一次循环
                              //更新路径长度的结点编号了
                    st[j] = true;//标记编号 j 结点
                }
            }
        }
    }
    
    return dist[n];
    
    
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    cin >> n >> m;
    
    memset(h,-1,sizeof(h));
    
    while(m--)
    {
        int a,b,c;
        cin >> a >> b >> c;
        
        add(a,b,c);
    }
    
    int t = spfa();
    if (t == 0x3f3f3f3f)
    cout  << "impossible";
    
    else
    cout << t;
    return 0;
}

 模拟过程:

  

(1) 为什么用队列?

spfa算法中使用队列是为了优化bellman_ford算法中的遍历每一条边来找到编号 结点的子结点

使用队列后,如此时t = 1,那么这一次循环中更新了 dist (第一次走到某结点时,都会更新,因为第一次走到某结点时的 dist 都是 0x3f3f3f3f )的结点就是编号 1 结点的子结点,加更新了 dist加入到队列,下次循环时,直接取出,就可以省略遍历所有边

(2)为什么不能有负权回路

(3)st数组有什么用 

我认为的作用之一就是处理重边

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

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

相关文章

Feign的基本使用

一、在项目中引入相关的依赖 创建两个微服务,分别为userservice、orderservice 现在需要在orderservie中查询用户相关的数据,所以需要使用feign进行远程调用userservice 1.1、在orderservice的pom.xml文件中添加下面的依赖 <dependency><groupId>org.springfram…

疫情居家办公系统--论文pf

TOC springboot394疫情居家办公系统--论文pf 第1章 绪论 1.1 课题背景 伴随着科技的进步&#xff0c;电子计算机已经成为人们日常生活不可或缺的办公工具。在这样的背景下&#xff0c;互联网技术被用于各个领域。为了能提高日常生活高效率&#xff0c;互联网信息技术性蓬勃…

Linux 网络套接字解析:实现网络通信

目录 一.网络基础1.协议2.OSI与TCP/IP模型3.网络通信流程4.IP与Mac地址 二.网络编程套接字1.端口号2.网络字节序3.tcp、udp协议4.socket编程5.sockaddr结构解析6.实现Udp_socket7.实现Windows与Linux通信8.Linux下远程执行指令9.实现tcp_socket10.守护进程 一.网络基础 1.协议…

IDEA中的 Maven 项目打包成Jar依赖,如何发布到本地仓库、远程仓库?

IDEA中的 Maven 项目打包成Jar依赖&#xff0c;如何发布到本地仓库、远程仓库&#xff1f; 默认读者都已经安装好 maven环境&#xff0c;如有不知道如何安装 maven 环境的&#xff0c;请先进行 maven 环境的安装学习教程&#xff01; 一、创建 maven 项目 按照图中方式&#xf…

python:画由两条抛物线所围成的图形

《高等数学》同济大学版 P338 编写 test_diff_2_area.py 如下 # -*- coding: utf-8 -*- """ 画由两条抛物线: ysqrt(x) , yx^2 所围成的图形的面积 """ import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import…

[算法题]排序数组

题目链接: 排序数组 快速排序求解 两个重点: 1. 选取随机数做 key, 不止固定选最左边的数做 key, 避免在数据有序时退化成 O(n^2) 的时间复杂度, 取 key 下标公式: rand() % (end - begin 1) begin (加上begin偏移, 保证当前的 key 在当前的区间内) 2. 三段划分, 将区间划…

MySQL中处理JSON数据

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言 在大数据时代&#xff0c;处理和分析结构化与非结构化数据的能力对于企业的成功至关重要。MySQL作为一种广泛使用的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;在应对传统结构化数据方面表现出色。然…

【html+css 绚丽Loading】 - 000003 乾坤阴阳轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

python基础篇(15):闭包

在函数嵌套的前提下&#xff0c;内部函数使用了外部函数的变量&#xff0c;并且外部函数返回了内部函数&#xff0c;我们把这个使用外部函数变量的内部函数称为闭包。 1 简单闭包 def outer(logo):def inner(msg):print(f"<{logo}>{msg}<{logo}>")retu…

yolov5网络初始化问题

当你打印detect层的三个特征层时&#xff0c;发现有三种不同的长和宽&#xff0c;如下图所示&#xff1a; 我提出三个问题&#xff1a; 为什么不一样呢&#xff0c;输入有什么含义吗&#xff1f; 为什么网络初始化四次&#xff08;forward)&#xff1f; 下面来逐个击破 1. torc…

LeetCode - LCR 146- 螺旋遍历二维数组

LCR 146题 题目描述&#xff1a; 给定一个二维数组 array&#xff0c;请返回「螺旋遍历」该数组的结果。 螺旋遍历&#xff1a;从左上角开始&#xff0c;按照 向右、向下、向左、向上 的顺序 依次 提取元素&#xff0c;然后再进入内部一层重复相同的步骤&#xff0c;直到提取完…

模型训练坎坷路--逐步提升模型准确率从40%到90%+

文章目录 〇、前言一、更改学习率1.原理&#xff1a;欠拟合需要减小学习率2.效果-->有用&#xff01; 二、更改训练批次batch_size1.原理&#xff1a;更大的批量大小时&#xff0c;梯度估计更加精确2.效果-->有点用 三、更改数据预处理方式1.原理&#xff1a;数据可能没有…

【微服务】springboot 整合表达式计算引擎 Aviator 使用详解

目录 一、前言 二、表达式计算框架概述 2.1 规则引擎 2.1.1 什么是规则引擎 2.1.2 规则引擎用途 2.1.3 规则引擎使用场景 2.2 表达式计算框架 2.2.1 表达式计算框架定义 2.2.2 表达式计算框架特点 2.2.3 表达式计算框架应用场景 2.3 表达式计算框架与规则引擎异同点 …

二叉树练习习题集一(Java)

1. 思路&#xff1a; 就是让左孩子和右孩子进行交换&#xff0c;这里需要一个中间变量用来记录&#xff0c;然后完成交换。如果进行优化则添加当左孩子和右孩子都为null时直接返回。 class Solution {public TreeNode invertTree(TreeNode root) {TreeNode tmpnull;//用来进行…

C++适配windows和linux下网络编程TCP简单案例

C网络编程 网络协议是计算机网络中通信双方必须遵循的一套规则和约定&#xff0c;用于实现数据的传输、处理和控制。这些规则包括了数据格式、数据交换顺序、数据处理方式、错误检测和纠正等。网络协议是使不同类型的计算机和网络设备能够相互通信的基础&#xff0c;是网络通信…

PDF转markdown工具:magic-pdf

1. magic-pdf 环境安装 conda create -n MinerU python3.10 conda activate MinerU pip install boto3>1.28.43 -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install magic-pdf[full]0.7.0b1 --extra-index-url https://wheels.myhloli.com -i https://pypi.tuna.t…

SSA-SVM多变量回归预测|樽海鞘群优化算法-支持向量机|Matalb

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&a…

Chrome浏览器更改默认User-Agent

一、业务需求 二、插件下载 三、插件使用 原创文章&#xff0c;请勿转载&#xff01; 详细教程教你如何更改默认浏览器的User-Agent&#xff0c;几分钟足以&#xff01; 一、业务需求 当我们遇到一些特定的UA才能访问的网址时&#xff0c;我们就可以通过一些手段来修改我们浏…

Python之字符串练习题(下)

21.nameStr“Albert Einstein"&#xff0c;如何使用字符串运算符“:”来提取 nameStr 中的名和姓? mingnameStr[:6] xingnameStr[7:]23.下面哪些语句在运行时不会出错? (a)var xyz ’ * 10.5 (b)var ‘xyz’ * ‘5 ©var‘’xyz’*5 (d)var‘xyz’*5.0 重复运算符…

HTML静态网页成品作业(HTML+CSS)——美食企业介绍设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…