Dijkstra?spfa?SPstra?

帶負權的無負環最短路問題

對于一張有負邊權的圖,普通 Dijkstra 就不能用了,比如:
在這里插入圖片描述
正常的 Dijkstra 擴散的節點依次為 1,3,2,41,3,2,41,3,2,4
這時候可以發現,當點 222 擴散的時候,原本達到點 333 的路徑長度是 111,路徑 1?2?31\longrightarrow2\longrightarrow31?2?3 的權值之和為 ?2-2?2,明顯更短,這個時候點111 到點 333 的路徑長度就會被更新為 ?2-2?2,但是,點 333 在點 222 之前已經被擴散過,不會在進行第二次擴散。此時,點 111 到點 444 的路徑長度依舊是 1+2=31+2=31+2=3

這里說明了 Dijkstra 的一個缺陷,貪心思路會考慮不到后續的負數。

那么,我們可以對 Dijkstra 做一個改動,解決現在遇到的問題。
上述的問題發生的根源就是 visvisvis 數組,在當前點找到更優值的時 visvisvis 數組不會改變,就導致了上圖中點 444 沒有被更新,所以我們在找到更優值時就再給當前點一個機會。

if(dis[y]>dis[x]+z){vis[y]=0;dis[y]=dis[x]+z;
}

這樣可以很好地解決上圖中出現的問題,但是判斷負環還是需要 SPFA
那么,我們將上述的改動版 Dijkstra 命名為SPstra
在這里插入圖片描述

帶負環的最短路問題

這個時候就可以考慮用到 SPFA。
SPFA 與 Dijkstra 的不同點:

入隊條件

Dijkstra 的遍歷概念是:擴散
而 SPFA 的遍歷概念是:挑選
SPFA 的標記表示的是“是否在隊列中”,也就是說有沒有看過這個元素值更新后對相連點的影響。
如果沒有在隊列中,并且還找到了當前點更優的方案,那么當前點就該入隊上班了。(可以借助文章最頂上的圖來理解)。

出隊標記

出隊后,元素就不在隊列中了,標記取消。

負環判斷

負環是什么?
負環就是一個有向圖中的環,并且對這個環遍歷一圈得到的權值總和為負,那么這個時候就可以一直繞著這個環轉圈圈,使權值總和越來越小。
我們假設:一張有 nnn 個點的有向圖中有這樣一個點 xxx,這個點十分有魅力,圖中其余的 n?1n-1n?1 個點都有一條邊連向這個點。

再極端一點,這其余的 n?1n-1n?1 個點按照被遍歷到的順序依次對點 xxx 有更優貢獻。
那么,這個點就會被入隊 n?1n-1n?1 次,這個時候還沒有出現負環。
但是,如果這個點再被入隊一次,入隊次數達到了 nnn 次,就一定有一個點(暫且稱為點 yyy)連接點 xxx 的這條路徑被遍歷了兩次,這個時候就有了負環,因為點 xxx 在被點 yyy 連接的情況下還有一條負數邊權和的路徑連接著點 yyy

SPFA 可否使用優先隊列優化

其實使用優先隊列優化的 SPFA 就是前面的 “SPstra” 加上一個負環判斷。

對于這個問題,答案是:能,但是很極端。

SPFA 優先隊列優化的適用場景

對于正邊權居多的圖,可以使用優先隊列優化,這樣可以使效率接近 Dijkstra 的 O(Nlog?N)O(N\log N)O(NlogN)

普通 SPFA 的適用場景

對于負邊權居多的圖,其實普通隊列和優先隊列的遍歷次數都是差不多的,只是順序變了,而且優先隊列還多了一個 O(log?N)O(\log N)O(logN),效率還不如普通隊列。

總結

考試或者比賽時,題目的數據我們無從得知。
但我們知道的是,造數據的人們都是陰險狡詐忠懇善良的,我們可以猜疑相信他們。

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

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

相關文章

React函數組件靈魂搭檔:useEffect深度通關指南!

你以為它只是替代componentDidMount?數據抓取、事件綁定、定時清理...?事實上,useEffect才是函數組件的“幕后操控者”!但依賴數組的坑、閉包的陷阱,你真的玩轉了嗎? 告別“能用就行”,今天帶你…

LabVIEW實驗室測試框架

在實驗室測試場景中,選用合適的 LabVIEW 框架能夠極大提升測試效率、優化測試流程并保障測試結果的準確性。介紹幾款常用且功能強大的 LabVIEW 測試框架:?TestStand?框架概述?TestStand 是 NI 公司專為測試系統開發設計的一款測試執行管理框架。它能夠…

Kiro :從“規范”到“實現”的全流程 AI 助手

為什么是 Kiro Kiro 是一款面向“規范驅動開發”(Spec-Driven Development)的 AI 開發助手。與只在“寫代碼”環節輔助不同,Kiro 將“從需求到設計再到實現”的完整鏈路顯性化,把需求、設計、任務分解、代碼與測試、文檔等全部納…

【0基礎PS】PS工具詳解--矩形工具

目錄前言一、矩形工具的基礎認知?二、矩形工具的選項欄詳解?三、矩形工具的繪制技巧?四、矩形工具的實際應用場景?五、常見問題與解決方案?總結前言 在 Photoshop(簡稱 PS)的眾多繪圖工具中,矩形工具是使用率極高的基礎工具之一。無論是…

移動端app專項測試

學習目標:app專項測試知識點,其他知識擴充一、app專項(app怎么測試/app側重點在哪)1.功能:跟前面功能測試一樣(跟需求文檔提取測試點,編寫測試用例)2.安裝1.不同品牌安裝,不同操作系…

Spring Boot 結合 CORS 解決前端跨域問題

Spring Boot 結合 CORS 解決前端跨域問題 1. 背景 在前后端分離的項目中,前端(例如 http://localhost:3000)調用后端接口(例如 http://localhost:8080)時,瀏覽器會因為 同源策略 限制而阻止請求&#xff0c…

GPT-5 發布:微小進步難掩瓶頸,AI 行業或迎冷靜

北京時間 8 月 8 日凌晨,OpenAI 的 GPT-5 在萬眾期待中登場。距離 GPT-4 發布已過去兩年半,然而這場發布會卻未重現 ChatGPT 初現時的驚艷,也沒有 GPT-4 的跨越式升級,更無 o1 發布時的震撼。1 小時 20 分鐘的發布會,充斥著不驚艷的測試數據、與競品難分高下的用例展示,甚…

僵尸進程、孤兒進程、進程優先級、/proc 文件系統、CRC 與網絡溢出問題處理(實戰 + 原理)

僵尸進程 / 孤兒進程:是什么、為什么會出現、如何定位與清理進程優先級:nice/priority、CFS 與實時調度、I/O 優先級、cgroup 限流/proc 文件系統:最常用路徑與診斷手法CRC 校驗:在存儲/網絡里的作用與局限、抓包“校驗錯誤”的常…

GPT-5 不僅是版本升級,它標志著 推理能力的商業化 和 Agent操作系統 的崛起,開啟了 AI革命時代。

GPT-5 不僅是版本升級,它標志著 推理能力的商業化 和 Agent操作系統 的崛起,開啟了 AI革命時代。 核心技術亮點: 商業化推理能力:AI不僅生成文本,還能 自動解決復雜任務,提升工作效率。 Agent操作系統&…

【C#】掌握并發利器:深入理解 .NET 中的 Task.WhenAll

在現代 .NET 應用程序開發中,異步編程(Asynchronous Programming)已成為提升性能、改善響應能力和充分利用多核處理器的關鍵技術。async 和 await 關鍵字極大地簡化了異步代碼的編寫,而 Task 類則是這一模型的核心。在處理多個并發…

微型導軌在半導體制造中有哪些高精密應用場景?

微型導軌在半導體制造中用于晶圓對準和定位系統,確保晶圓在光刻、蝕刻等工藝中精確移動。其高精度、高剛性、低摩擦和緊湊設計等特性,使其成為半導體設備實現微米級運動控制的核心部件。光刻機:在光刻工藝中,微型導軌支撐并引導掩…

全棧:Tomcat 安裝教程

Tomcat 安裝教程 安裝 Tomcat 的步驟因操作系統而異,以下是 Windows、Linux 和 Mac 系統的詳細安裝方法: 一、Windows 系統安裝 Tomcat 下載 Tomcat 訪問 Tomcat 官方網站(http://tomcat.apache.org/),選擇適合的版本…

數據分析——Pandas庫

Pandas是Python生態系統中最強大、最流行的數據分析庫,專為處理結構化數據(如表格和時間序列)而設計。它提供了高效的數據結構和豐富的功能,使得數據清洗、轉換、分析和可視化變得簡單直觀。一、Pandas庫的安裝詳解1. 安裝前的準備…

數據結構-哈希表(散列表)

1.基本概念哈希表(散列表):提高數據的查找效率哈希存儲:將要存儲的數據的關鍵字和存儲位置之間,建立起對應的關系, 這個關系稱之為哈希函數。存儲數據時,通過對應的哈希函數可以將數據映射到指定…

如何在Vue中使用拓撲圖功能

前言 該組件基于 Vue.js 和 AntV G6 構建項目特色功能 1. 豐富的節點圖標支持 本拓撲圖系統的最大特色是支持使用自定義圖片作為節點圖標 2. 智能的力導向布局 系統采用力導向布局算法,能夠自動優化節點位置,避免重疊,形成美觀的網絡拓撲結構…

基于dynamic的Druid 與 HikariCP 連接池集成配置區別

你提供的內容是關于 ??dynamic-datasource-spring-boot-starter?? 的詳細介紹,這是一個非常實用的 ??Spring Boot 多數據源動態切換組件??,適用于需要在單個應用中連接多個數據庫并靈活切換數據源的場景。下面我為你梳理一下該組件的核心信息與使…

算法訓練之棧

???~~~~~~歡迎光臨知星小度博客空間~~~~~~??? ???零星地變得優秀~也能拼湊出星河~??? ???我們一起努力成為更好的自己~??? ???如果這一篇博客對你有幫助~別忘了點贊分享哦~??? ???如果有什么問題可以評論區留言或者私信我哦~??? ??????個人…

OpenAI 最新開源模型 gpt-oss (Windows + Ollama/ubuntu)本地部署詳細教程

OpenAI 最近發布了其首個開源的開放權重模型gpt-oss,這在AI圈引起了巨大的轟動。對于廣大開發者和AI愛好者來說,這意味著我們終于可以在自己的機器上,完全本地化地運行和探索這款強大的模型了。 本教程將一步一步指導你如何在Windows系統上&…

在X86架構Linux中創建虛擬根目錄并下載指定架構(如aarch64)的軟件包(含依賴)

在X86架構Linux中創建虛擬根目錄并下載指定架構(如aarch64)的軟件包(含依賴) 在Linux系統中,有時候我們需要在特定的環境或架構下安裝軟件包,而不影響主系統。一種常見的方法是創建一個虛擬的根目錄,并在此環境中操作。本文將介紹如何通過創建…

scratch筆記和練習-第9課:一起來繪畫

位圖也稱為點陣圖,它是由許許多多的點組成的,這些點被稱為像素。位圖圖像可以表現豐富的多彩變化 并產生逼真的效果,很容易在不同軟件之間交換使用, 但它在保存圖像時需要記錄每一個像素的色彩信息,所以占用的存儲空間…