牛客14369之最短路(SPFA模板)

2021-10-09 23:59:37 字數 1323 閱讀 7306

簡單暴力的題目要求:

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

第一行兩個整數n, m。

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

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

3 3

1 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到任意點的最短路,即任意兩點之間的最短路徑問題

注意有負權

對於這個問題我們可以使用floyd演算法或者spfa演算法

題目中說明不會存在負環

觀察資料量要求,floyd演算法不適用,所以這道題是乙個spfa演算法的模板題

對於spfa是對於bfs演算法的優化,加入了動態更新。

#include #include #include using namespace std;

const int n = 2e4+10;

const int m = 2e5+10;

const int inf = 0x3f3f3f3f;

struct edge

edge(int _v, int _w, int _next)

}e[m];

int head[n], size;

void init()

void insert(int u, int v, int w)

void insert2 (int u, int v, int w)

int n, m;

int dis[n];

bool vis[n];

void spfa(int u)}}

}}int main()

spfa(1);

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

return 0;

}

最短路 spfa (一)

最短路 spfa 首先建立起始點a到其餘各點的 最短路徑 首先源點a入隊,當佇列非空時 隊首元素a 出隊,對以a為起始點的所有邊的終點依次進行鬆弛操作 此處有b,c,d三個點 此時路徑 狀態為 在鬆弛時三個點的最短路徑估值變小了,而這些點佇列中都沒有出現,這些點 需要入隊,此時,佇列中新入隊了三個結...

SPFA 最短路問題

簡單的說,spfa就是通過佇列 來實現的求最短路徑的演算法 首先,要用到乙個鄰接表來儲存各頂點之間的關係 包括起點u,終點v,以及u,v之間的權值w 然後就是構造spfa函式 第一步 對dis 用來存從源點到各頂點的最短距離 初始化為 inf 乙個很大的數例如0x3f3f3f3f 對 vis 陣列初...

最短路 SPFA演算法

spfa 是bellman ford的佇列優化,時效性相對好,時間複雜度o ke 與bellman ford演算法類似,spfa演算法採用一系列的鬆弛操作以得到從某乙個節點出發到達圖中其它所有節點的最短路徑。所不同的是,spfa演算法通過維護乙個佇列,使得乙個節點的當前最短路徑被更新之後沒有必要立刻...