信息學奧賽一本通 1498:Roadblocks | 洛谷 P2865 [USACO06NOV] Roadblocks G

【題目鏈接】

ybt 1498:Roadblocks
洛谷 P2865 [USACO06NOV] Roadblocks G

【題目考點】

1. 圖論:嚴格次短路徑

嚴格次短路的路徑長度必須大于最短路的路徑長度。
非嚴格次短路的路徑長度大于等于最短路的路徑長度。

【解題思路】

每個交叉路口是一個頂點,每條路是無向邊,求從頂點1到頂點n的嚴格次短路。
使用Dijkstra堆優化算法。
設Path類,包含屬性u和d,表示存在一條從源點出發到達頂點u,長度為d的路徑。
設優先隊列pq,優先隊列中保存的元素為Path類型對象,路徑長度d更小的Path對象更優先。
設dis1,dis2數組,dis1[i]表示從源點到頂點i的最短路徑長度,dis2[i]表示從源點到頂點i的次短路徑長度。
首先將dis1和dis2數組每個元素都設為無窮大。
已知源點1到頂點1自己的最短路徑長度為0,設dis1[1]=0,那么存在一條從源點到頂點1,長為0的路徑,將對象Path{1, 0}入隊到優先隊列pq。
每次循環從優先隊列出隊長度最短的路徑,取出該路徑為從源點到達頂點u,路徑長度為d。
訪問頂點u的每個鄰接點,頂點u到其鄰接點v的邊權為w。那么就存在一條從源點到頂點v的長為d+w的路徑。

  • 如果該到達頂點v的長為d+w的路徑比從源點到頂點v的最短路徑長度dis1[v]更小,那么原來的最短路徑長度變為次短路徑長度,即dis2[v] = dis1[v],當前的最短路徑長度是d+w,設dis1[v] = d+w
    現在存在一條新的到達頂點v長為dis1[v]的路徑,將對象Path{v, dis1[v]}入隊。
  • 如果該到達頂點v的長為d+w的路徑比從源點到頂點v的最短路徑長度dis1[v]更大(注意不能等于dis1[v]),d+w比次短路徑長度dis2[v]更小,那么當前的次短路徑長度應該為d+w,設dis2[v] = d+w
    現在存在一條新的到達頂點v長為dis2[v]的路徑,將對象Path{v, dis2[v]}入隊。

最后結果為源點1到頂點n的嚴格次短路長度,即dis2[n]

關于使用Dijkstra堆優化算法求次短路時,不能設vis數組進行優化

如果使用Dijkstra堆優化算法求最短路徑,每個頂點只出隊1次即可,第2次出隊時沒有必要繼續擴展。可以設vis數組記錄頂點是否已出隊。而在求次短路過程中不能使用該方法進行優化。

已知從優先隊列中出隊的各個Path對象的路徑長度d屬性的單調遞增的。

如果出隊的Path對象為到達頂點u路徑長度為d1。根據優先隊列的比較規則,此時d1小于等于優先隊列中所有Path對象的d屬性。
通過頂點u擴展出的新的路徑的長度為d1+w(w為頂點u到其某個鄰接點的邊權),因為Dijkstra的前提是圖中沒有負權邊,所以d1+w一定大于d1,因此新入隊的Path對象的d屬性也大于d1。
因此接下來出隊的Path對象的d屬性一定大于等于d1,即按出隊順序看,Path對象的d屬性是單調遞增的。

頂點u第一次出隊時,出隊的Path對象為到達頂點u有長為d1的路徑。頂點u第二次出隊,出隊的Path對象為到達頂點u有長為d2的路徑。那么根據上述原理,一定有 d 2 ≥ d 1 d2\ge d1 d2d1。認為到頂點u有長為d1的路徑,接下來擴展得到到其它頂點的最短路徑長度,一定小于等于認為到頂點u有長為d2的路徑,接下來擴展得到到其它頂點的最短路徑長度。因此如果一個頂點第二次出隊,就沒有必要再繼續進行擴展了。
vis[u]表示頂點u是否已經出隊。如果頂點u已經出隊過了,則不再訪問更新其鄰接點。否則設vis[u]為真,標記頂點u已出隊,接下來訪問更新其鄰接點。

而求次短路時不應設vis數組記錄頂點是否出隊,因為當頂點u第二次出隊時,如果是到頂點u有長為d2的路徑,基于該存在的路徑雖然不可能再更新各頂點的最短路徑dis1的長度,但可能更新各頂點的次短路徑dis2的長度。因此求次短路時不能進行該優化過程。

【題解代碼】

解法1:Dijkstra堆優化算法

#include<bits/stdc++.h>
using namespace std;
#define N 5005
struct Edge
{int v, w;
};
struct Pair
{int u, d;//u:頂點 d:sv到u有一條長為d的路徑 bool operator < (const Pair &b) const{return b.d < d;}
};
vector<Edge> edge[N];
int n, m, dis1[N], dis2[N];//dis1[i]:源點到i的最短路徑長度 dis2[i]:源點到i的嚴格次短路長度 
void dijkstra(int sv)
{priority_queue<Pair> pq;memset(dis1, 0x3f, sizeof(dis1));memset(dis2, 0x3f, sizeof(dis2));dis1[sv] = 0;pq.push(Pair{sv, dis1[sv]});while(!pq.empty()){int u = pq.top().u, d = pq.top().d;pq.pop();for(Edge e : edge[u]){int v = e.v, w = e.w;if(dis1[v] > d+w){dis2[v] = dis1[v];dis1[v] = d+w;pq.push(Pair{v, dis1[v]});}else if(dis1[v] < d+w && d+w < dis2[v]){dis2[v] = d+w;pq.push(Pair{v, dis2[v]});}}}
}
int main()
{int f, t, w;cin >> n >> m;for(int i = 1; i <= m; ++i){cin >> f >> t >> w;edge[f].push_back(Edge{t, w});edge[t].push_back(Edge{f, w});}dijkstra(1);cout << dis2[n];return 0;
}

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

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

相關文章

Arm CPU安全通告:基于TrustZone的Cortex-M系統面臨多重故障注入攻擊

安全之安全(security)博客目錄導讀 目錄 一、概述 二、致謝 三、參考文獻??????Black Hat USA 2022 | Briefings Schedule 四、版本歷史 一、概述 Arm注意到BlackHat 2022大會官網發布的演講摘要《糟糕..&#xff01;我又一次故障注入成功了&#xff01;——如何突…

【頻域分析】包絡分析

【頻域分析】包絡分析 算法配置頁面 可以一鍵導出結果數據 報表自定義繪制 獲取和下載【PHM學習軟件PHM源碼】的方式 獲取方式&#xff1a;Docshttps://jcn362s9p4t8.feishu.cn/wiki/A0NXwPxY3ie1cGkOy08cru6vnvc

ElMessage

以下是關于 ElMessage 的詳細說明和使用方法&#xff1a; 什么是 ElMessage ElMessage 是 Element Plus 提供的一個全局消息提示組件&#xff0c;用于在頁面上顯示短暫的消息提示。它可以用于顯示成功、警告、錯誤等不同類型的消息。 基本用法 1. 引入 ElMessage 在使用 E…

全面解析 KaiwuDB 數據庫的數據類型

在現代數據庫管理系統中&#xff0c;數據類型的選擇至關重要。它不僅決定了數據存儲的效率&#xff0c;還影響到查詢的速度和數據的一致性。KaiwuDB&#xff0c;作為一款開源的分布式數據庫&#xff0c;提供了多種數據類型&#xff0c;以適應不同的業務需求和存儲要求。本文將全…

【計網】網絡交換技術之分組交換(復習自用,重要1)

復習自用的&#xff0c;處理得比較草率&#xff0c;復習的同學或者想看基礎的同學可以看看&#xff0c;大佬的話可以不用浪費時間在我的水文上了 另外兩種交換技術可以直接點擊鏈接訪問相關筆記&#xff1a; 電路交換 報文交換 一、分組交換的定義 1.定義 分組交換&#x…

C++ STL及Python中等效實現

一. STL 概述 STL 包含以下核心組件&#xff1a; 容器&#xff08;Containers&#xff09;&#xff1a;存儲數據的結構&#xff0c;如數組、鏈表、集合等。迭代器&#xff08;Iterators&#xff09;&#xff1a;用于遍歷容器的接口&#xff0c;類似指針。算法&#xff08;Alg…

python-63-前后端分離之圖書管理系統的Flask后端

文章目錄 1 flask后端1.1 數據庫實例extension.py1.2 數據模型models.py1.3 .flaskenv1.4 app.py1.5 運行1.6 測試鏈接2 關鍵函數和文件2.1 請求視圖類MethodView2.2 .flaskenv文件3 參考附錄基于flask形成了圖書管理系統的后端,同時對其中使用到的關鍵文件.flaskenv和函數類M…

藍橋杯真題——好數、R格式

目錄 藍橋杯2024年第十五屆省賽真題-好數 【模擬題】 題目描述 輸入格式 輸出格式 樣例輸入 樣例輸出 提示 代碼1&#xff1a;有兩個案例過不了&#xff0c;超時 藍橋杯2024年第十五屆省賽真題-R 格式 【vector容器的使用】 題目描述 輸入格式 輸出格式 樣例輸入…

Python中NumPy的索引和切片

在數據科學和科學計算領域&#xff0c;NumPy是一個功能強大且廣泛使用的Python庫。它提供了高效的多維數組對象以及豐富的數組操作函數&#xff0c;其中索引和切片是NumPy的核心功能之一。通過靈活運用索引和切片操作&#xff0c;我們可以輕松訪問和操作數組中的元素&#xff0…

設計模式:策略模式 - 消除復雜條件判斷的利器

一、什么是策略模式&#xff1f; 策略模式&#xff08;Strategy Pattern&#xff09;是一種行為型設計模式&#xff0c;它將一組算法或業務邏輯封裝為獨立的策略類&#xff0c;使這些策略可以互換使用&#xff0c;并通過上下文類動態選擇合適的策略。 核心思想 ? 將不同的行…

LeetCode hot 100—不同路徑

題目 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&#xff1f; …

pytorch查詢字典、列表維度

輸出tensor變量維度 print(a.shape)輸出字典維度 for key, value in output_dict.items():if isinstance(value, torch.Tensor):print(f"{key} shape:", value.shape)輸出列表維度 def get_list_dimensions(lst):# 基線條件&#xff1a;如果lst不是列表&#xff0…

多坐標系變換全解析:從相機到WGS-84的空間坐標系詳解

多坐標系變換全解析:從相機到WGS-84的空間坐標系詳解 一、常見坐標系簡介二、各坐標系的功能和使用場景1. WGS-84 大地坐標系(經緯高)2. 地心直角坐標系(ECEF)3. 本地 ENU / NED 坐標系4. 平臺坐標系(Body)5. 相機坐標系三、坐標變換流程圖四、如何選用合適的坐標系?五…

【NumPy科學計算:高性能數組操作核心指南】

目錄 前言&#xff1a;技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析核心概念圖解關鍵技術模塊技術選型對比 二、實戰演示環境配置要求核心代碼實現運行結果驗證 三、性能對比測試方法論量化數據對比結果分析 四、最佳實踐推薦方案 ?常見錯誤 ?調試技…

【特權FPGA】之PS/2鍵盤解碼

0 故事背景 見過這種接口的朋友們&#xff0c;大概都已經成家立業了吧。不過今天我們不討論這種接口的歷史&#xff0c;只講講這種接口的設計。&#xff08;如果還沒有成家的朋友也別生氣&#xff0c;做自己想做的事情就對了&#xff01;&#xff09; 1 時序分析 數據幀格式如圖…

DAPP實戰篇:使用web3.js實現前端輸入錢包地址查詢該地址的USDT余額—操作篇

專欄:區塊鏈入門到放棄查看目錄-CSDN博客文章瀏覽閱讀396次。為了方便查看將本專欄的所有內容列出目錄,按照順序查看即可。后續也會在此規劃一下后續內容,因此如果遇到不能點擊的,代表還沒有更新。聲明:文中所出觀點大多數源于筆者多年開發經驗所總結,如果你想要知道區塊…

高中生學習數據隱私保護的“技術-制度-文化”協同機制研究

一、引言 1.1 研究背景與意義 在數字化時代的浪潮下&#xff0c;教育領域正經歷著深刻的變革&#xff0c;智能教育平臺如雨后春筍般涌現&#xff0c;為高中教育帶來了新的活力與機遇。這些平臺借助先進的信息技術&#xff0c;能夠實時收集、分析大量的高中生學習數據&#xf…

【Java多線程】告別線程混亂!深度解析Java多線程4大實現方式(附實戰案例)

一、繼承Thread類 實現步驟&#xff1a; 1.繼承Thread類 2.重寫run()方法 3.創建線程對象并調用start()方法 示例&#xff1a; class MyThread extends Thread {Overridepublic void run() {for (int i 0; i < 5; i) {System.out.println(Thread.currentThread().getNam…

全國產V7-690T核心板/算法驗證板/FPGA開發板

UD SOM-404全國產化信號處理模塊既可以作為核心板使用&#xff0c;也可以單獨使用。FPGA對外有80組GTY通過兩個FMC連接器全部引出&#xff0c;多個模塊可以級聯使用&#xff0c;擴展信號處理能力。FMC連接器也滿足標準規范&#xff0c;可以插入標準的FMC或FMC子板。模塊為100%國…

STM32_HAL庫提高中斷執行效率

目錄 中斷流程分析我的解決辦法優缺點 大家都在說STM32 HAL 庫中斷效率低下。具體哪里不行&#xff1f;如何優化&#xff1f; 我手里的項目要用到多個定時器TIM6、TIM7、TIM9、TIM10、TIM11、TIM12、TIM13&#xff0c;在處理這些定時器中斷的時候&#xff0c;也發現了這個問題。…