【題目描述】
布達佩斯的街道形成了乙個彎曲的單向網路。你要參加乙個賽跑,比賽中你需要穿越這些街道,從s開始,到t結束。
要求寫乙個程式來計算乙個從s到t的嚴格次短路線。
嚴格次短路線可能訪問某些節點不止一次,樣例2是乙個例子。
【輸入描述】
第一行包含兩個整數n和m,n代表布達佩斯的節點個數,m代表邊的個數。節點編號從1到n。1代表出發點s,n代表終點t;
接下來的m行每行三個整數a、b、l,代表有一條從a到b的長度為l的單向同路。你可以認為a不等於b,也不會有重複的(a,b)對。
【輸出描述】
輸出從s到t的嚴格次短路的長度。如果從s到t的路少於2條,輸出-1。
【樣例輸入】
樣例1:
4 61 2 5
1 3 5
2 3 1
2 4 5
3 4 5
1 4 13
樣例2:
2 21 2 1
2 1 1
【樣例輸出】
樣例1:
11樣例2:
3 【資料範圍及提示】
樣例1:
有兩條長度為10的最短路徑(1 → 2 → 4,1 → 3 → 4)並且有一條長度為11的嚴格次短路徑(1 → 2 → 3 → 4)。
樣例2:
有一條長度為1的最短路徑(1 → 2)並且有一條長度為3的嚴格次短路徑(1 → 2 → 1 → 2)。
源**:#include
#include
#include
using
namespace
std;
struct
node
i[1000001
];queue
q;bool
in[200001]=;
int n,m,num(0),head[200001
];long
long dis[200001],f[200001]; //
re真乃神坑也!
void add(int a,int b,int
c)void spfa(int
s) }
else
if (dis[t2]!=dis[t1]+i[a].t&&f[t2]>dis[t1]+i[a].t) //
只更新次短路。
}else
if (f[t2]>f[t1]+i[a].t) //仔細想一想會發現,當dis[t2]=dis[t1]時,只得如此更新。}}
}}int
main()
for (int a=1;a<=m;a++) //
賦極大大大值。
dis[a]=f[a]=1000000000
; spfa(
1); //
從起點開始。
if (f[n]<1000000000
) printf(
"%lld
",f[n]);
else
printf("-1
");return0;
}
匈牙利遊戲
題目描述 布達佩斯的街道形成了乙個彎曲的單向網路。你要參加乙個賽跑,比賽中你需要穿越這些街道,從s開始,到t結束。要求寫乙個程式來計算乙個從s到t的嚴格次短路線。嚴格次短路線可能訪問某些節點不止一次,樣例2是乙個例子。輸入描述 第一行包含兩個整數n和m,n代表布達佩斯的節點個數,m代表邊的個數。節點...
codevs 1269 匈牙利遊戲
qaq 求次短路分三種情況討論 1 最短能更新最短 2 次短能更新次短 3 最短能更新次短並且次短不能更新最短 什麼叫不能更新最短了呢 就是更新完了和最短一樣長的 恩恩 就是這樣 include include include include include using namespace std ...
codevs 1269 匈牙利遊戲
codevs 1269 匈牙利遊戲 題目大意 求次短路 資料範圍 2 n 20000,1 m 100000,1 l 10000 思路 spfa的時候在更新最短路的時候順便更新一下次短路就好了。題解 include include include include using namespace std...