匈牙利遊戲

2021-07-23 09:52:26 字數 1565 閱讀 9041

【題目描述】

布達佩斯的街道形成了乙個彎曲的單向網路。你要參加乙個賽跑,比賽中你需要穿越這些街道,從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...