BZOJ 1778:[Usaco2010ホル] DOTP所望追放豚ガウス消去の確率+

これはかなり優しい彼は比較的容易に考え出すことができることを-
$ Fを作る[i]は$ $ iが$は、$ ANS [I] = F [、所望の数の出発点を表し I] \回\ FRAC {P} { Q} $

#include <cmath>    
の#include <cstdioを> 
する#include <アルゴリズム>   
の#define N 305 
の#define setIO(S)freopenは(S ".IN"、 "R"、STDIN)、(S freopenは".out"を、「W 」、STDOUT)
名前空間stdを使用。  
エッジをint型。  
ダブルF [N]、[N]。       
INT度[N]、[N * N]にHD [N]、NEX [N * N]。
ボイド追加(INT U、V INT)
{ 
    NEX [++エッジ] = HD [U]、HD [U] =縁、[エッジ]へ= V。  
} 
ボイドガウス(int型N)
{ 
    int型I、J、K、今。
    用(i = 1; iが<= N; I ++)
    { 
        今= I。        
        用(J = I; J <= N; ++ j)は
        { 
            IF(ファブ(F [J] [I])> [今] [i])とFファブ()は、現在J =。
        { 
            ため(J = 1; J <= N; ++ j)はスワップ(F [I] [J]、F [今] [J])。
        } 
        ([I] [I] F)であれば
        { 
            ため(J = I + 1、J <= N + 1; ++ j)はF [I] [J] / = F [i]は[I]。
            F [i]は[I] = 1。
        } 
        (j = I + 1 ++ J; J <= n)のための
        { 
            [i]をダブルDIV = F [J]。  
            [J] [K] F - = DIVの*のF [i]が[K](K ++; = N + 1 <K、K = I + 1)のために、                                        
            F [j]は[I] = 0; 
        } 
    } 
    (; I> = 1; I = N - i)に対する
    { 
        (J = I + 1、J <= N; ++ j)のための
        { 
            [1 + N] [i]は、F - = F [J ] [N + 1] * F [I] [J]。  
        } 
    } 
}         
メインINT() 
{
    // setIO( "入力"); 
    N INT、M、P、Q、I、J。   
    アウト、で倍増。
    scanf関数( "%D%D%D%D"、&N、&M、&P&Q)。
    IN = 1.0 *(ダブル)(1.0 *のP / Q)、アウト= 1.0で、  
    用(i = 1; iが<= M; ++ I)
    { 
        int型、B。
        scanf関数( "%d個の%のD"、&、&B)、(B)、追加(B、A)、++度[A]、++度[B]。
    } 
    F [1]〜[N + 1] = 1。   
    用(i = 1; iは= N <; ++ I)
    { 
        F [i]は[I] = 1。   
        用(J = HD [I]; J; J = NEX [J])
        { 
            int型V = [J]であり;     
            F [i]は[V] = - ((1.0 /度[V])*アウト)。       
        }    
    } 
    ガウス(N)   
    (I = 1; iが<= N。
        printf( "%9Fを\ n"、[I] [N + 1] *におけるF)。
    } 
    0を返します。
}

  

おすすめ

転載: www.cnblogs.com/guangheli/p/11529600.html