題目描述 description
你早上起來,慢悠悠地來到學校門口,發現已經是八點整了!(這句話裡有乙個比較重要的條件)
學校共有n個地點,編號為1~n,其中1號為學校門口(也就是你現在所處的位置),2號為你的教室(也就是你的目的地)。這些地點之間有m條雙向道路,對於第i條道路,為了不引起值周隊老師的懷疑,你通過它的時間須恰好為ti秒。這個數可能為負數,意義為時間倒流。
不過,即使沒有引起懷疑,值周隊也布下了最後一道防線:大龍會在教室處不定期出現。當然,你也了解大龍的習性:當前時間的秒數越小,大龍出現的概率就越低,例如:8:13:06這一時刻的秒數是06,就要比8:12:57這個時刻更加安全。
現在的問題是,在不引起懷疑的前提下,最安全的到達時刻的秒數是多少。如果學校門口到教室沒有路(-_-||),請輸出60。
注意,你可以選擇在途中的任何時候經過教室,而不結束「旅程」,具體見樣例。
輸入描述 input description
第一行為兩個整數,n和m,意義在上面已經說過了。
第2行~第m+1行,每行代表一條道路。第i+1行代表第i條道路,這一行有3個整數,ai,bi,ti,表示ai號地點與bi號地點有一條雙向道路,通過它的時間必須為ti秒。
輸出描述 output description
只有一行,為最安全的到達時刻的秒數。
樣例輸入 sample input
input1:
2 12 1 54
input2:
3 31 2 26
1 3 17
2 3 -9
input3:
3 11 3 110
input4:
2 21 2 7
2 1 9
input5:
2 21 2 3
1 1 1
input6:
2 21 2 9
1 2 11
樣例輸出 sample output
output1:
output2:
output3:
output4:
output5:
output6:
資料範圍及提示 data size & hint
樣例1的說明:一共只有兩個地點(多麼福利的資料啊),也只有一條道路,耗時為54秒。最優方案為,經過這個道路9次,耗時486秒,即8分06秒,於8:08:06到達教室。當然,最優方案不唯一。
樣例2的說明:走1->3->1->2,用時17+17+26,於8:01:00到達;或走1->2->3->1->2,用時26-9+17+26,於8:01:00到達。
對於20%的資料,n≤2;對於40%的資料,n≤100;對於70%的資料,n≤1000;
對於100%的資料,2≤n≤7000,0≤m≤9000,1≤ai,bi≤n,|ti|≤109。
/*搜尋就過了,剛開始負權路沒有處理好,得了80分
*/#include
#include
#define n 10010
using
namespace
std;
int head[n],vis[n][61
],n,m;
struct
node
;node e[n*2
];void add(int i,int x,int y,int
z)int init(int
ti)void dfs(int x,int
t) }
}int
main()
vis[
1][0]=1
; dfs(
1,0);
for(int i=0;i<=59;i++)
if(vis[2
][i])
printf("60
");return0;
}
Codevs 1961 躲避大龍
題目 題解 有一點像數字三角形的某個加強版 spfa 開乙個二維陣列dis i j 表示i號節點有無長度為j的路徑 spfa的取min改為更新dis陣列 注意 一開始沒處理負邊權,wa了兩組 處理負邊時每次 60,tle了好多組 那麼那些負邊權的點在第一次是怎麼過的呢 笑 codevs的資料真是坑的...
codevs1961 躲避大龍
時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 題解你早上起來,慢悠悠地來到學校門口,發現已經是八點整了!這句話裡有乙個比較重要的條件 學校共有n個地點,編號為1 n,其中1號為學校門口 也就是你現在所處的位置 2號為你的教室 也就是你的目的地 這些地點之間有m條雙向...
codevs1961 躲避大龍 spfa
題目描述 description 你早上起來,慢悠悠地來到學校門口,發現已經是八點整了!這句話裡有乙個比較重要的條件 學校共有n個地點,編號為1 n,其中1號為學校門口 也就是你現在所處的位置 2號為你的教室 也就是你的目的地 這些地點之間有m條雙向道路,對於第i條道路,為了不引起值周隊老師的懷疑,...