SPFA 最短路 次短路 GF打Dota

2021-09-11 18:15:27 字數 1730 閱讀 4032

求乙個點到另乙個點的最短路或次短路

第一行為n,m(表示一共有m條路徑)

接下來m行,每行3個整數a,b,c,表示編號為a,b的點之間連著一條花費時間為c的無向路徑。

接下來一行有乙個整數p,p=0表示spartan沒有開掛使用這種魔法,p=1則表示使用了。

所花費的最短時間t,資料保證一定可以到達n。

樣例輸入1:

5 5

1 2 1

1 3 2

3 5 2

2 4 3

4 5 1

0

樣例輸入2:
5 5

1 2 1

1 3 2

3 5 2

2 4 3

4 5 1

1

樣例輸出1:

樣例輸出2:對於50%的資料,1<=n,m<=5000

對於70%的資料,1<=n<=10000, 1<=m<=50000,p=0,

對於100%的資料,1<=n<=10000, 1<=m<=50000,p=1

無向圖,花費時間c>=0

正著跑一遍spfa,是第乙個點到每乙個點的最短路(a),倒著跑一遍spfa,是每個點到n的最短路(b),如果是最短路就直接輸出,如果是次短路,就列舉每一條邊,將其中乙個點的a和另乙個點的b再加上這條邊的長度,求出這條路線的長度,在這些中找出次短路即可

#

include

#include

#include

#include

using

namespace std;

int n,m,x,y,c,w,pp,now,ans,sum,aa[

50005

],bb[

50005

],cc[

50005

],b[

10005

],b1[

10005

],p[

10005

],head[

10005];

struct

reca[

100005];

intmain()

scanf

("%d"

,&pp)

;memset

(b,127/3

,sizeof

(b))

;memset

(b1,

127/3,

sizeof

(b1));

queue<

int>d;

d.push(1

);b[1]=

0;p[1]=

1;while

(!d.

empty()

)//正著

} p[now]=0

;}if(

!pp)

sum=b[n]

; d.

push

(n);

b1[n]=0

; p[n]=1

;while

(!d.

empty()

)//倒著

} p[now]=0

;}ans=

2147483647

;for

(int i=

1;i<=m;

++i)

printf

("%d"

,ans)

;}

最短路 SSL 1297 GF打Dota

給出一張圖,求出從點1 11到點n nn的次短路徑。分別以起點和終點跑一次最短路,然後列舉一條邊來繞長最短路變成次短路,更新答案。include include include include int n,m,tot 1 p,ans int ver 100001 next 100001 head 1...

tyvj 1450 GF打Dota 次短路

求最短路和次短路當p 1 p 1p 1時,顯然是最短路。當p 2 p 2p 2時 首先以1和n為起點做一遍單源最短路,然後列舉每一條邊 x,y 求出起點到x 終點到y 邊 x,y 權值之和,若不等於1 n最短路長度則更新ans。預期得分100分 include include include inc...

最短路 spfa (一)

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