求乙個點到另乙個點的最短路或次短路
第一行為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三個點 此時路徑 狀態為 在鬆弛時三個點的最短路徑估值變小了,而這些點佇列中都沒有出現,這些點 需要入隊,此時,佇列中新入隊了三個結...