很久沒有寫過高斯消元了,看著別人的**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是等...