BZOJ2337 期望 高斯消元

2021-08-09 11:25:28 字數 1247 閱讀 1653

很久沒有寫過高斯消元了,看著別人的**yy了一會。一遍敲出來感覺成就感++;

而且gauss這個單詞感覺特別帥有沒有!!

bzoj2337傳送門

(突然發現一張圖就把所有題目資訊包含完了,不用手打還有點不習慣…)

因為原題是要求異或期望,位與位之間沒有影響,所以拆開處理。

( 以下的分析均是針對某一二進位制位上的值 )

定義f[u]表示從u點走到n點時,該位為1的期望

對於點u和u能到的點v來說(deg[u]表示u的度數):

如果邊上的權值為0,那麼f[u] += f[v] / deg[u]

如果邊上的權值為1,那麼f[u] += ( 1 - f[v] ) / deg[u]

邊界:f[n] = 0 【顯然,因為n就是終點了】

這張圖是無向的,不能直接靠拓撲關係求解,由是採用高斯消元

實現的時候為了方便,並沒有採用小數的形式,而是等式左右兩邊同時乘上了deg[u]。

需要注意的地方有兩個

一是在方程矩陣裡對於每個f[u][u],它的初值是deg[u],因此要麼在列舉完v之後f[u][u]+=deg[u],要麼是在列舉值前賦值。

二是邊界f[n]為0,無論f[n][n]是什麼值,最後解出來n的答案都是0。在我的程式中,f[n][n]必須賦值,不然會被gauss判定無解(雖然這題根本就不用判斷)。

#include 

#include

#include

using

namespace

std ;

int n , m , deg[105] , head[105] , tp ;

double f[105][105] , ans ;

struct pathp[20005] ;

void in( int t1 , int t2 , int t3 )

template

t abs( t x )

void gauss_ele()

}for( int i = n ; i ; i -- )

}int main()

for( int w = 0 ; w <= 30 ; w ++ )

}f[n][n] = 1234321.0;

gauss_ele() ;

ans += f[1][n+1] * ( 1

<< w ) ;

}printf( "%.3f" , ans ) ;

}

BZOJ1778 期望 高斯消元

bzoj1778 給你一張n nn個點m mm條邊的無向圖,最開始有一顆炸彈在一號節點,它有p q frac qp 的概率 如果沒有 它會等概率的移動到另乙個與當前節點相連的點,問炸彈分別在每個點 的概率。考慮一維的向量矩陣a aa,第i ii位表示炸彈停在i ii點的概率是aia ai 那麼初始時...

遊走 HNOI2013 期望Dp 高斯消元

vjudge 乙個無向連通圖,頂點從1編號到n,邊從1編號到m。小z在該圖上進行隨機遊走,初始時小z在1號頂點,每一步小z以相等的概率隨機選 擇當前頂點的某條邊,沿著這條邊走到下乙個頂點,獲得等於這條邊的編號的分數。當小z 到達n號頂點時遊走結束,總分為所有獲得的分數之和。現在,請你對這m條邊進行編...

bzoj2337 XOR路徑 高斯消元

遇到位運算,還是一位一位來。假設考慮二進位制第k位,那麼 令f i 表示以到達i時,第i位存在的期望,那麼對於所有與i相連的j,如果 i,j 的第k位為1,那麼f i 1 f j i的入度,否則f i f j i的入度。這樣看起來有n個方程,但是有乙個是沒用的,隨便去掉乙個。然後實際上令從n到1是等...