演算法十三 最短路

2021-08-20 06:40:55 字數 1681 閱讀 9948

問題描述

給定一張 n 個點的

無向帶權圖

,節點的編號從 1 至 n,求從 s 到 t 的最短路徑長度。

第一行 4 個數 n,m,s, t,分別表示點數、邊數、起點、終點。

接下來 m 行,每行 3 個正整數 u,v,w,描述一條 u 到 v 的雙向邊,邊權為 w。

保證 1<=u,v<=n。

輸出一行乙個整數,表示 s 到 t 的最短路。

7 11 5 4 (7個點,11條邊,起點是5,終點是4)

7(3+1+3)
本題共設定 12 個測試點。

對於前 10 個測試點,保證 n<=2500,m<=6200,對於每條邊有 w<=1000。這部分資料有梯度。

對於所有的 12 個測試點,保證 n<=100,000,m<=250,000。

[本題是 dijkstra 演算法的模板練習題。]

[使用樸素的 dijkstra 演算法可以通過前 10 個測試點。]

[使用堆或__std::priority_queue__優化的 dijkstra 演算法可以通過所有測試點。]

// ***************== **實現開始 ***************==

const int n = 100005;

typedef pairpii;

//graph:存放圖,graph[i]表示的是節點i的出邊,其中first儲存到達的節點,second儲存邊權

//pq:輔助dijkstra演算法的優先佇列

//flag:記錄每個節點是否進行過鬆弛,1表示進行過,0表示未進行過

//mind:儲存起點s到每個節點的最短路徑長度

vectorgraph[n];

priority_queue,greater> pq;

bool flag[n];

int mind[n];

// 這個函式用於計算答案(最短路)

// n:節點數目

// m:雙向邊數目

// u,v,w:分別存放各邊的兩端點、邊權

// s,t:分別表示起點、重點

// 返回值:答案(即從 s 到 t 的最短路徑長度)

int shortestpath(int n, int m, vectoru, vectorv, vectorw, int s, int t) }}

return mind[t];

}// ***************== **實現結束 ***************==

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...

最短路演算法

常用的最短路演算法有三種 disjkstra,floyd,ballman floyd 一 disjkstra演算法 dijkstra演算法要求圖上的權非負數。同樣使用於無向圖 html view plain copy include stdio.h hdu 2544 define maxsum 0x...

最短路演算法

最短路演算法有很多,具體哪個好,和資料是有很大關係的 從起點開始向外擴充套件,最壞o v e 實際體驗比o e log v 的dijkstra可能快 include include define max e 4002 define max v 1002 define inf 0x3f3f3f usi...