acwing基础课——spfa

news2024/11/19 21:18:48

由数据范围反推算法复杂度以及算法内容 - AcWing

常用代码模板3——搜索与图论 - AcWing

基本思想:

        一般单源最短路我们都可以用spfa算法来做,如果过不了再尝试其他算法。

        spfa算法就是在bellman-ford算法的基础上就行优化,bellman-算法是每次都会执行一遍dist[b] = min(dist[b], backup[a] + w); 效率比较低,spfa则是在这步上进行优化,假如dist[b]变小,那一定是backup[a]发生了改变,如果backup[a]没有发生改变那么dist[b]不会发生变化,所以我们通过队列,将发生改变了的点a放入队列,队列不为空的情况下,不断用发生了改变的点取改变它连通的点,并且,如果连通的点改变了且不在队列里,就将其加入队列,不断更新得到最短路径。

        同时spfa算法也通常用来判断负环,我们用cnt[N]数组来表示当前点最短路径的边数,如果某个点的cnt[j]≥n,我们可以知道如果没有自环,那么n条边至少有n+1个点,由抽屉原理可知,至少有一个点经过了两次,说明路径上存在一个环且是负环。

        ps:抽屉原理 把多于n+1个的物体放到n个抽屉里,则至少有一个抽屉里的东西不少于两件。 

851. spfa求最短路 - AcWing题库

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

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

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

输入格式

第一行包含整数 n 和 m。

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

输出格式

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

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

数据范围

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

输入样例:

3 3
1 2 5
2 3 -3
1 3 4

输出样例:

2
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>

using namespace std;

const int N = 100010;
int n, m;
int h[N], e[N], ne[N], idx;
int w[N], dist[N];
bool st[N]; //判断是否在队列当中

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

void spfa()
{
   memset(dist, 0x3f, sizeof dist);
   dist[1] = 0;

   queue<int> q;
   q.push(1);
   st[1] = false;
   
   while(q.size())
   {
       int t = q.front();
       q.pop();
       st[t] = false;
       
       for(int i = h[t]; ~i; i = ne[i])
       {
           int j = e[i];
           if(dist[j] > dist[t] + w[i])
           {
               dist[j] = dist[t] + w[i];
               if(!st[j])
               {
                   q.push(j);
                   st[j] = true;
               }
           }
       }
   }
}

int main()
{
    memset(h, -1, sizeof h);

    cin >> n >> m;

    while(m--)
    {
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c);
    }

    spfa();

    if(dist[n] == 0x3f3f3f3f) cout << "impossible";
    else cout << dist[n];

    return 0;
}

例题:

852. spfa判断负环 - AcWing题库

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

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

相关文章

微信小程序|小程序事件

首先,我们在index.wxml中与index.js中添加如下代码: <button bindtap="alert">bindtap</button>Page({data: {},alert: function (event) {wx.showToast({title: 触发成功, // 标题icon: success, // 图标类型,默认successduration: 1500 // 提示窗停…

贪吃蛇复现-CoCube

需要完成下面所提及博文中里面所有前序案例&#xff1a; 从开环到闭环的旅程-CoCube 在完成如上代码之后&#xff0c;添加一个彩蛋&#xff0c;贪吃蛇的案例。 蓝桥ROS之半自动贪吃龟turtlesim版 基本上就是上述代码复现一下&#xff0c;完全没有难度的。 贪吃蛇复现-CoCubep…

程序员最关心的问题,我都帮你们问AI了

前言 最近几天互联网刮起了一阵ChatGPT风&#xff0c;起因是OpenAI发布了一个全新的聊天机器人模型—— ChatGPT&#xff0c;可以像人类交谈般回答大部分问题甚至还能直接帮你写代码。 我们先来试试让它帮我们写个代码&#xff1a; 有一丝丝的恐惧&#xff0c;害怕过两年就会失…

redis—主从,哨兵,集群

redis常见的使用方式 Redis的几种常见使用方式包括: Redis单副本;Redis多副本(主从) ;Redis Sentinel (哨兵) ;Redis Cluster;Redis自研。 使用场景: 如果数据量很少&#xff0c;主要是承载高并发高性能的场景&#xff0c;比如缓存一般就几个G的话&#xff0c; 单机足够了。…

Qt扫盲-QPushButton 理论总结

QPushButton 理论总结一、简述二、常用要点1. 快捷键相关2. 信号相关3. 默认按钮3. 推荐使用4. 重复功能5. 菜单功能一、简述 PushButton 按钮或CommandButton 按钮应该是图形用户界面中最常用的小部件。按下&#xff08;单击&#xff09;一个按钮就可以命令计算机执行某些操作…

【1691. 堆叠长方体的最大高度】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你 n 个长方体 cuboids &#xff0c;其中第 i 个长方体的长宽高表示为 cuboids[i] [widthi, lengthi, heighti]&#xff08;下标从 0 开始&#xff09;。请你从 cuboids 选出一个 子集 &#xff0c…

快速傅里叶变换及Python代码实现

一、前言 我想认真写好快速傅里叶变换&#xff08;Fast Fourier Transform&#xff0c;FFT&#xff09;&#xff0c;所以这篇文章会由浅到细&#xff0c;由窄到宽的讲解&#xff0c;但是傅里叶变换对于寻常人并不是很容易理解的&#xff0c;所以对于基础不牢的人我会通过前言普…

阿里巴巴2022年最新最全500道Java后端面试大全(值得收藏)

进大厂是大部分程序员的梦想&#xff0c;而进大厂的门槛也是比较高的&#xff0c;所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全其中概括的知识点有&#xff1a;Java基础、spring、springmvc、springboot、springcloud、JVM、Tomcat、dubbo、netty、zookeeper共有50…

Java中四大线程池应用及详解

线程池的思想 我们使用线程的时候就去创建一个线程&#xff0c;这样实现起来非常简便&#xff0c;但是就会有一个问题&#xff1a; 如果并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间很短的任务就结束了&#xff0c;这样频繁创建线程就会大大降低系统的效率&a…

移动网络技术--名词介绍

GPRS网络制式&#xff08;General Packet Radio Service&#xff09;为“通用分组无线服务”&#xff0c;它是利用“包交换”&#xff08;Packet-Switched&#xff09;的概念所发展出的一套基于GSM系统的无线传输方式。 GGSN&#xff08;Gateway GPRS Supporting Node,网关GPR…

Nginx入门到弃坑---安装与使用篇(2)

1 下载 官网传送门下载传送门点击下载最新Windows-1.23版下载传送门点击下载最新Linux-1.23版下载传送门 2 Windows安装 2.1 环境介绍 下载完成后解压缩 目录如下 配置文件地址&#xff1a;.\nginx-1.23.2\conf\nginx.conf&#xff0c;默认配置的nginx监听的端口为80&…

监控系列(一)DM8+Prometheus+Grafana搭建

一、背景 近期进行适配&#xff0c;因用户统一监控平台使用的是promethesugrafanaaltermannger这一套&#xff0c;因此对达梦数据库进行适配对接。 目前主要有两种方式&#xff1a; 1. 部署Dem管理系统对外提供接口推送到prometheus进行采集数据&#xff0c;采集项可查看《De…

【云计算与大数据技术】分布式计算、虚拟化技术、并行编程技术等技术讲解(超详细必看)

一、分布式计算 分布式计算是一种计算方法&#xff0c;和集中式计算相对&#xff0c;随着计算的发展&#xff0c;一些应用需要巨大的计算能力才能完成&#xff0c;如果采用集中式计算则需要耗费很长的时间&#xff0c;而分布式计算将应用分解成许多更小的部分&#xff0c;分配…

文献阅读(195)物理设计/时序分析

文章目录物理设计时序分析题目&#xff1a;Intelligent Design Automation for 2.5/3D Heterogeneous SoC Integration时间&#xff1a;2020会议&#xff1a;ICCAD研究机构&#xff1a;国立台湾大学 本篇论文的主要贡献&#xff1a; 物理设计&#xff1a;包括RDL布线和板级布…

蚁群优化算法解决TSP问题(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

CSS 3万字超详细总结

文章目录1. CSS简介2. CSS的使用2.1 行内样式2.2 内部样式表2.3 外部样式表2.4 多重样式与样式优先级3. CSS选择器3.1 简单选择器3.1.1 元素选择器3.1.2 id选择器3.1.3 class选择器3.2 组合器选择器3.2.1 后代选择器3.2.2 子选择器3.2.3 相邻兄弟选择器3.2.4 通用兄弟选择器3.3…

C# 流程控制语句

一 结构化程序设计的三种基本流程 1 顺序 分支 循环 2 简单语句 最简单的语句&#xff1a;方法调用语句及赋值语句 后面有个分号 如&#xff1a; System.Console.Write("Hello World"); ba>0?a:-a; sTextBox1.Text; dint.Parse(s);注意&#xff1a;没有表达式…

SpringBoot简单优雅实现图片上传功能(超详细)

文章目录前言技术栈项目目录前端实现index.htmlscript.js后端实现MultipartFile 介绍配置文件实体类ControllerMapperService拦截器测试结果展示前言 最近有一个需求需要实现图片上传&#xff0c;因此&#xff0c;本人找到了一个可以快速实现该功能的插件mini-upload-form。在…

CAS:2374782-03-1,NOTA-FAPI-4化学试剂供应

试剂描述 NOTA-FAPI-4是FAPI-4的类似物和成纤维细胞活化蛋白&#xff08;FAP&#xff09;抑制剂。NOTA-FAPI-4可作为PET示踪剂用于检测与成纤维细胞活化蛋白相关的紊乱。 试剂基本信息 1、名称&#xff1a;NOTA-FAPI-4 2、CAS编号&#xff1a;2374782-03-1 3、分子式&#x…

Seata模式

爬虫组件分析目录概述需求&#xff1a;设计思路实现思路分析1.一、AT 模式参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survi…