確率DPライト1321

質問の意味:非有向グラフの確率を考えると、各辺が合格しなかった場合は、その後、彼らは新しいスタートの出発点に戻ってくる、パスを持っている
正常に到達すれば、固定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 }

 

 

おすすめ

転載: www.cnblogs.com/pangbi/p/11609744.html