演算法訓練 最短路

2022-02-18 06:13:37 字數 1718 閱讀 3506

演算法訓練 最短路  

時間限制:1.0s   記憶體限制:256.0mb

問題描述

給定乙個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,保證從任意頂點都能到達其他所有頂點。

spfa(shortest path faster algorithm)(佇列優化)演算法是求單源最短路徑的一種演算法,它還有乙個重要的功能是判負環(在差分約束系統中會得以體現),在bellman-ford演算法的基礎上加上乙個佇列優化,減少了冗餘的鬆弛操作,是一種高效的最短路演算法。

演算法大致思路:

s表示源點

利用dist[x]表示從源點s到x的最短距離

用q佇列來儲存需要處理的結點

用inqueue[x]儲存點x是否在佇列中

初始化:dist陣列全部賦值為無窮大,比如int_max(一定要足夠大, 我一開始就是給小了所以有些資料錯了)

dist[s] = 0

開始演算法:佇列+鬆弛操作

讀取q隊首元素並出隊(記得把inqueue[q.top()]置為false)

對與隊首結點相連的所有點v進行鬆弛操作(如果源點通過隊首結點再到結點v的距離比源點直接到v的距離要短,就更新dist[v],並且如果inqueue[v] == false 即v當前不在佇列中,則v入隊,當佇列q為空時,判斷結束)

1 #include 2 #include 3 #include 4 #include 5

#define n 200005

6#define nn 20005

7#define inf 0x3f3f3f3f

8#define mem(a,b) memset(a,b,sizeof(a))

9using

namespace

std;

10 queueq;

11struct

edgeedge[n];

16int

m;17

intdist[nn];

18int

vis[nn];

19int

head[nn];

20void add(int

from,int to,int

val)

2627

void spfa(int

s)42}43

}44 vis[temp] = 0;45

}46}47

48int

n,m;

49int

main()

61 spfa(1

);62

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

65return0;

66 }

演算法訓練 最短路

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

演算法訓練 最短路

最近在學習一些常見的演算法,演算法這東西不練是不行的,所以學習的同時也找了些題來練。我找的題目 於 vjudge 上的 kuangbin帶你飛專題訓練。每做完乙個專題,我都會寫一篇部落格整理一下這個專題。現在這個專題是,圖論中的最短路。最短路相關的演算法有很多,在專題訓練中會用到的有 dijkstr...

演算法訓練 最短路

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