藍橋杯 ALGO 5最短路

2021-10-02 08:20:41 字數 1313 閱讀 9069

問題描述

給定乙個n個頂點,m條邊的有向圖(其中某些邊權可能為負,但保證沒有負環)。請你計算從1號點到其他點的最短路(頂點從1到n編號)。

輸入格式

第一行兩個整數n, m。

接下來的m行,每行有三個整數u, v, l,表示u到v有一條長度為l的邊。

輸出格式

共n-1行,第i行表示1號點到i+1號點的最短路。

樣例輸入

3 31 2 -1

2 3 -1

3 1 2

樣例輸出

-1-2

資料規模與約定

對於10%的資料,n = 2,m = 2。

對於30%的資料,n <= 5,m <= 10。

對於100%的資料,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保證從任意頂點都能到達其他所有頂點。

題意:給定乙個有向圖,然後求從1號節點到其他節點的最短距離,而且路徑的權值中有負的權值。

思路:對於此題,主要是邊的權值為負的情況,所以不能直接使用dijkstar的演算法,要使用變形的,即廣度優先遍歷+dijstar演算法也就是其他猿友說的spfa演算法,

摘錄猿友的解釋:

它可以在o(ke)的時間複雜度內求出源點到其他所有點的最短路徑,可以處理負邊。

spfa 在形式上和bfs非常類似,不同的是bfs中乙個點出了佇列就不可能重新進入佇列,但是spfa中乙個點可能在出佇列之後再次被放入佇列,也就是乙個點改進過其它的點之後,過了一段時間可能本身被改進,於是再次用來改進其它的點,這樣反覆迭代下去。

判斷有無負環:如果某個點進入佇列的次數超過v次則存在負環(spfa無法處理帶負環的圖)。

具體做法就是:維護乙個先進先出的佇列,進行深度搜尋,每次佇列出隊首元素,然後把其鄰接的點且從節點1到該節點的距離比原來小時就更新,如果該節點不在佇列中就將其加入佇列,且將其標識置為true,否則不做。最後列印從1到其他節點的所有距離。

**:

#include #include#include#define n 20010

#define inf 65536

using namespace std;

struct node;

int d[n], n, m;//儲存圖,最短路徑

bool inqueue[n];//標識該點是否在佇列中

vectorg[n];//鄰接表儲存圖資訊

void spfa() );

} spfa();

for (int i = 2; i <= n; i++)

return 0;

}

藍橋杯 ALGO 5 最短路

演算法訓練 最短路 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定乙個n個頂點,m條邊的有向圖 其中某些邊權可能為負,但保證沒有負環 請你計算從1號點到其他點的最短路 頂點從1到n編號 輸入格式 第一行兩個整數n,m。接下來的m行,每行有三個整數u,v,l,表示u到v有一條長度為l的...

藍橋杯 ALGO 5 最短路

給定乙個n個頂點,m條邊的有向圖 其中某些邊權可能為負,但保證沒有負環 請你計算從1號點到其他點的最短路 頂點從1到n編號 第一行兩個整數n,m。接下來的m行,每行有三個整數u,v,l,表示u到v有一條長度為l的邊。1 n 20000,1 m 200000,10000 l 10000 保證從任意頂點...

藍橋杯 ALGO 5 演算法訓練 最短路

問題描述 給定乙個n個頂點,m條邊的有向圖 其中某些邊權可能為負,但保證沒有負環 請你計算從1號點到其他點的最短路 頂點從1到n編號 輸入格式 第一行兩個整數n,m。接下來的m行,每行有三個整數u,v,l,表示u到v有一條長度為l的邊。輸出格式 共n 1行,第i行表示1號點到i 1號點的最短路。樣例...