質問の意味:非有向グラフの確率を考えると、各辺が合格しなかった場合は、その後、彼らは新しいスタートの出発点に戻ってくる、パスを持っている
正常に到達すれば、固定Kの開始から終了までの時間、および追加の必要性Kは時間がかかり、Sの倍の最小予想時間を行くように頼ま
最初の部分はspfaを求めている、この質問は、2つの部分に分かれて、答えの第二部は、派生道路最大確率によって計算され、どのようにそれを数え、最短計算して、Eのために期待を設定し、:考えます成功の確率は、p、成功した場合、P *は、2Kの期待値、失敗した場合、(1-P)*(Eの期待値である + 2K) 従ってE = P *を2K +(1 -p)*(E + 2K) のジェーンはE = 2000 / Pで最終的にSを乗じました
1の#include <cstdioを> 2の#include <アルゴリズム> 3の#include <math.h>の 4の#include < 文字列・H> 5の#include <キュー> 6 使って 名前空間STDを、 7 のconst int型 MAXN = 1E4 + 10 。 8 CONST INT INF = 0x3f3f3f3f 。 9 int型ヘッド[MAXN]、NUM = - 1 。 10 INT S、T。 11 二重 DIS [MAXN]。int型VIS [MAXN]。 12 構造体ノード 13 { 14 int型V、次。 15 二重W。 16 } G [MAXN]。 17 ボイドビルド(INT U、INT V、ダブルw)の 18 { 19 G [++ NUM] .V = V; G [NUM] .W = W; G [NUM] .next =頭部[U];頭[ U] = NUM。 20 G [++ NUM] .V = U、G [NUM] .W = W; G [NUM] .next =頭部[V]、ヘッド[V] = NUM。 21 } 22 ボイドのinit() 23 { 24 のmemset(ヘッド、 - 1、はsizeof (ヘッド))。 25 NUM = - 1 。 26 } 27 ボイドSPFA() 28 { 29 のmemset(DIS、0、はsizeof (DIS))。 30の DIS [ 0 ] = 1 。 31 キュー< 整数 > Q; 32 q.push(0 )。 33 VIS [ 0 ] = 1 。 34 ながら(!q.empty()){ 35 // のprintf( "11111111111111111111111111 N \")。 36 INT U = q.front()。 37 q.pop()。 38 VIS [U] = 0 ; 39 のためには、(int型 I =ヘッド[U];!I = - 1 ; I = G [i]が.next){ 40 のint V = G [I] .V。ダブル W = G [i]が.W。 41 であれば(DIS [V] <DIS [U] * W){ 42の DIS [V] = DIS [U] * W。 43 であれば(!VIS [V]){ 44 q.push(V)。 45 VIS [V] = 1 。 46 } 47 } 48 } 49 } 50 } 51 のint main()の 52 { 53 INT T。 54 のscanf(" %dの"、&T)。 55 int型 CNT = 0 。 56 一方(T-- ){ 57 のinit(); 58 int型N、M、S、K。 59 のscanf(" %D%D%D%D "、&N、&M、&S&K)。 60 のために(int型 I = 1 ; I <= M Iは++ ){ 61 のint U、V。ダブルワット; 62 のscanf(" %D%D%LF "、&U&V、およびW) 63 = w / wの100 。 64 ビルド(U、V、W)。 65 } 66 SPFA()。 67 二重 ANS =のDIS [N- 1 ]。 68 ダブル TMP = 1.0 /のANS; 69 TMP =(ダブル)(* TMP 2 * k個*のS)。 70 のprintf(" ケースは%d:%のLFの\ nを"、++ CNT、TMP); 71 } 72 リターン 0 ; 73 }