算法學習筆記(最短路——spfa)

前置:bellman-ford


s p f a spfa spfa B e l l m a n ? F o r d Bellman-Ford Bellman?Ford算法的改進。在 B e l l m a n ? F o r d Bellman-Ford Bellman?Ford中,我們在每一輪中枚舉了每一條邊,但是實際上,在上一輪中沒有被更新的點所延伸出來的邊是不需要訪問的,因為上一輪中沒有被更新的點值沒變,邊權沒變,再向下也只是重復一次,不會更新出新的值,所以是無效訪問。 s p f a spfa spfa就是省略了 B e l l m a n ? F o r d Bellman-Ford Bellman?Ford中的這些無效訪問。

具體寫法參考 B F S BFS BFS思路,用隊列維護需要更新的點。同時,我們要關注下一個要更新的點在不在隊列中,如果在隊列中就不需要重復入隊了。(入隊了也是重復更新,做無用功)

s p f a spfa spfa也具有 B e l l m a n ? F o r d Bellman-Ford Bellman?Ford有的判斷負環的功能。在上篇講過,每個點最多只會被更新 n n n次,所以可以同時維護一個 c n t cnt cnt數組,表示每個點被更新的次數,只要有一個點被更新超過 n n n次就退出,判為存在負環。


例題:

【模板】Bellman-Ford算法-StarryCoding | 踏出編程第一步

題目描述

n n n m m m邊的帶負權有向圖(連通,可能存在重邊與自環),求 1 1 1到所有點的單源最短路的距離。

保證結點 1 1 1可以到達所有結點。

如果圖中存在負環,則只輸出一個整數 ? 1 ?1 ?1

輸入描述

第一行兩個整數 n , m 。 ( 2 ≤ n , m ≤ 1 × 1 0 4 ) n, m。(2 \leq n , m \leq 1 \times 10^4) n,m(2n,m1×104)

接下來 m m m行,每行一條單向邊 x , y , z x,y,z x,y,z表示存在一條從 x x x y y y的距離為 z z z的通道。 ( 1 ≤ x , y ≤ n , ? 1 0 9 ≤ z ≤ 1 0 9 ) (1 \leq x, y \leq n, -10^9 \leq z \leq 10^9) (1x,yn,?109z109)

輸出描述

一行 n n n個整數,第 i i i個整數表示從點 1 1 1到點 n n n的最短距離。

如果圖中存在負環,則只輸出一個整數 ? 1 ?1 ?1

輸入樣例1

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

輸出樣例1

0 1 -1 0 -5

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 9;
using ll = long long;
const ll inf = 2e18;struct Edge
{int x;ll w;
};int n, m;
vector<Edge> g[N];
ll d[N];bool spfa(int st)
{//兩行初始化,不要忘記for(int i = 1; i <= n; ++i) d[i] = inf;d[st] = 0;queue<int> q;       //隊列存儲需要更新的點bitset<N> inq;      //inq[i]表示第i個點在不在隊列中q.push(st);         vector<int> cnt(n + 1);     //計數while(q.size())     {int x = q.front(); q.pop(); inq[x] = false;for(auto [y, w] : g[x])         //更新所有邊{if(d[y] > d[x] + w)         //如果能被更新,更新且入隊{if(++ cnt[y] >= n) return true;     //出現負環,退出d[y] = d[x] + w;if(!inq[y]){q.push(y);inq[y] = true;}}}}return false;
}void solve()
{cin >> n >> m;for(int i = 1; i <= m; ++i){int u, v;ll w; cin >> u >> v >> w;g[u].push_back({v, w});}if(spfa(1)) cout << -1 << '\n';else{for(int i = 1; i <= n; ++i) cout << d[i] << ' ';}
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int _ = 1;while(_--) solve();return 0;
}

易錯提醒:還還還是別忘記初始化,別忘記初始化,別忘記初始化。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10187.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10187.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10187.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

睿爾曼機械臂ROS控制

下載git工程 git clone https://github.com/RealManRobot/rm_robot.git安裝配置 catkin build rm_msgs source devel/setup.bash catkin build source setup.bash這里注意&#xff0c;如果采用setup.sh多半不會成功&#xff0c;必須要source setup.bash文件&#xff0c;ros才…

train_gpt2_fp32.cu

源程序 llm.c/test_gpt2_fp32.cu at master karpathy/llm.c (github.com) #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <assert.h> #include <float.h> #include <string.h> #include…

二叉樹的最小深度和二叉樹的節點數

二叉數的最小深度&#xff1a; 思路&#xff1a;和最大深度一樣需要用到回溯遞歸的方法 代碼大致內容 判斷函數是否為空&#xff0c;如果是空return 0&#xff1b; 定義一個變量接收遞歸函數返回的值&#xff08;左&#xff09; 定義一個變量接收遞歸函數返回的值&#xf…

力扣每日一題-收集垃圾的最少總時間-2024.5.11

力扣題目&#xff1a;收集垃圾的最少總時間 題目鏈接: 2391.收集垃圾的最少總時間 題目描述 代碼純享版 class Solution {public int garbageCollection(String[] garbage, int[] travel) {int sum 0;int last_M -1,last_P -1, last_G -1;for(int i 0; i < garbage.…

以Azure為例的SSO

由于文章的篇幅有限&#xff0c;無法將全部的代碼貼上來&#xff0c;如想要看完整案例&#xff0c;請在公眾號文章中留言(其他平臺很少看…畢竟最近印度同事的UI組件庫搞得我好煩) 1.關于SSO 單點登錄又稱之為SSO,全稱為 Single Sign On &#xff0c;一般在多個應用系統中&…

Github2024-05-10開日報 Top10

根據Github Trendings的統計&#xff0c;今日(2024-05-10統計)共有10個項目上榜。根據開發語言中項目的數量&#xff0c;匯總情況如下&#xff1a; 開發語言項目數量Python項目4TypeScript項目4JavaScript項目1Lua項目1C項目1Rust項目1Dart項目1 RustDesk: 用Rust編寫的開源遠…

U盤文件剪切丟失怎么辦?揭秘原因并給出恢復方法

在日常生活和工作中&#xff0c;U盤已成為我們不可或缺的數據存儲和傳輸工具。但有時候&#xff0c;我們在對U盤中的文件進行剪切操作時&#xff0c;會遇到文件丟失的情況。這種突如其來的數據消失往往會讓人感到驚慌和困惑。那么&#xff0c;為什么U盤剪切時文件會丟失呢&…

運營模型—歸因分析(Attribution Analysis)

運營模型—歸因分析(Attribution Analysis) 隨著互聯網技術和業務的發展,廣告投放相關的業務也隨之興起。那么廣告投放的效果評估也就隨之而來。廣告的投放一般都是收費模式,所以選中的渠道商的好壞直接和自己的利益掛鉤。于是,「歸因分析」便最早應用在了廣告投放行業。(…

IDEA 常見設置問題

OutOfMemoryError IDEA 第一次運行項目時&#xff0c;會報錯誤 - java.lang.OutOfMemoryError: Java heap space / insufficient memory&#xff0c;解決辦法是&#xff1a; 將圖示部分由默認的 700 改為 2048。 import * 工程lint檢查時不允許使用import *&#xff0c;IDE…

Python中如何讀取文件夾及其文件:使用os模塊詳解

路徑os Python中如何讀取文件夾及其文件&#xff1a;使用os模塊詳解引入os模塊讀取文件夾獲取當前工作目錄更改工作目錄列出目錄內容 讀取文件夾下的文件檢查是文件還是目錄使用os.path.join()**重點內容**&#xff1a;**使用os模塊來讀取和管理文件及目錄&#xff0c;特別是os…

使用Selenium自動化操作瀏覽器!

Selenium可以自動化操作瀏覽器&#xff0c;例如&#xff1a;選擇元素&#xff0c;輸入&#xff0c;點擊等&#xff0c;可以用于軟件自動化測試&#xff0c;爬蟲等工作&#xff0c;也可以做你想做的任何事情。 本文環境&#xff1a; Python3.12&#xff0c;Windows10&#xff0…

python實現星號打印出金字塔

#編程實現下列圖形的打印 a input() for i in range(int(a)//21): num * * ((i1)*2-1) print(num.center(int(a), )) 編譯后通過。輸入20后得到下面的星號金字塔

拓撲排序——數據結構

拓撲排序是對有向無環圖&#xff08;DAG&#xff09;的頂點進行線性排序的方法。關鍵在于每個頂點代表了一個任務&#xff0c;而每條有向邊代表了任務間的先后依賴關系。這個排序保證了每個任務只在它依賴的任務完成后才開始。 拓撲排序的本質是這樣的&#xff1a;你有一堆任務…

c#教程——索引器

前言&#xff1a; 索引器&#xff08;Indexer&#xff09;可以像操作數組一樣來訪問對象的元素。它允許你使用索引來訪問對象中的元素&#xff0c;就像使用數組索引一樣。在C#中&#xff0c;索引器的定義方式類似于屬性&#xff0c;但具有類似數組的訪問方式。 索引器&#x…

Cloudera的簡介及安裝部署

簡介 Cloudera是一家位于美國的軟件公司&#xff0c;成立于2008年&#xff0c;專注于為企業客戶提供基于Apache Hadoop的軟件、支持、服務以及培訓。Cloudera的開源Apache Hadoop發行版&#xff0c;即Cloudera Distribution including Apache Hadoop&#xff08;CDH&am…

【計算機網絡原理】初識網絡原理和一些名詞解釋??

?????? write in front ??????? ?????????大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之處請多多諒解&#xff0c;讓我們一起共同進步????? . ?? ?xiaoxie?????????—CSDN博客 本文由xiaoxie????????? 原創 CSDN 如…

未來辦公新方式--智能體與程序完美配合

Agent AI智能體的未來 工作中&#xff0c;有時候我們就像是在不停地踩著縫紉機&#xff0c;重復地做著那些單調乏味的任務&#xff0c;不僅耗時費力&#xff0c;還特別容易出錯。可是&#xff0c;咱們現在可是生活在數字化時代啊&#xff01;這時候&#xff0c;Python編程語言…

docker私有倉庫registry

簡介 Docker私有倉庫的Registry是一個服務&#xff0c;主要用于存儲、管理和分發Docker鏡像。具體來說&#xff0c;Registry的功能包括&#xff1a; 存儲鏡像&#xff1a;Registry提供一個集中的地方來存儲Docker鏡像&#xff0c;包括鏡像的層次結構和元數據。 版本控制&…

嵌入式人工智能是一個怎樣的概念呢?

嵌入式人工智能將會是未來幾年人工智能發展的主要方向之一&#xff0c;并且會伴隨著一系列的職位和角色的出現。雖然目前還沒有嵌入式人工智能的確切定義&#xff0c;但隨著人工智能的不斷發展&#xff0c;它勢必會延伸到邊緣、終端和嵌入式市場。 嵌入式人工智能具有速度快、功…

攻略:大學生三下鄉投稿媒體網站和快速方法

作為當代大學生,不僅需要學習和掌握知識,更需要將所學知識運用到實踐中,參與各種社會實踐活動。其中,“三下鄉”活動就是一個非常有意義的社會實踐活動。三下鄉社會實踐活動新聞稿投稿網站有哪些?有哪些方式可以快速投稿呢&#xff1f;今天小編給大家一次講個明白。 三下鄉新…