[bzoj1778]
給你一張n
nn個點m
mm條邊的無向圖,最開始有一顆炸彈在一號節點,它有p
q\frac
qp的概率**,如果沒有**,它會等概率的移動到另乙個與當前節點相連的點,問炸彈分別在每個點**的概率。
考慮一維的向量矩陣a
aa,第i
ii位表示炸彈停在i
ii點的概率是aia_
ai,那麼初始時炸彈停在1
11號節點a=(
1,0,
0,..
.,0,
0)
a=(1,0,0,...,0,0)
a=(1,0
,0,.
..,0
,0),考慮如何轉移,設did_
di表示i
ii點的度數,那麼有aia_
ai=∑(1
−pq)
∗1dj
∗a
j\sum(1-\frac)*\frac}*a_
∑(1−qp
)∗d
j1
∗aj
(j
jj為i
ii能到達的點)。那麼可以建立乙個n∗n
n*nn∗
n的矩陣b
bb,bi,
j=(1
−pq)
∗1dj
b_=(1-\frac)*\frac}
bi,j=
(1−q
p)∗
dj1
,那麼最終答案矩陣ans
ansan
s=(a+a
⋅b+a
⋅b⋅b
+...
+a⋅b
oo
)(a+a\cdot b+a\cdot b\cdot b+...+a\cdot b^)
(a+a⋅b
+a⋅b
⋅b+.
..+a
⋅boo
),等比數列求和得到ans
=ai−
bans=\frac
ans=i−
ba,ans
⋅(i−
b)=a
ans\cdot (i-b)=a
ans⋅(i
−b)=
a,直接高斯消元即可。
#include#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const double eps=1e-15;
const int n=500;
struct nodee[100010];
int lin[100010],d[n],len=0,n,m,x,y;
double a[n][n],ans[n],p,q;
void read(int x,int y)
bool gauss()
} ans[n]=a[n][n+1];
per(i,n-1,1)
}return 1;
}int main()
a[1][n+1]=1;
rep(x,1,n)
} gauss();
rep(i,1,n)printf("%.9lf\n",ans[i]*p+eps);
return 0;
}
BZOJ2337 期望 高斯消元
很久沒有寫過高斯消元了,看著別人的 yy了一會。一遍敲出來感覺成就感 而且gauss這個單詞感覺特別帥有沒有!bzoj2337傳送門 突然發現一張圖就把所有題目資訊包含完了,不用手打還有點不習慣 因為原題是要求異或期望,位與位之間沒有影響,所以拆開處理。以下的分析均是針對某一二進位制位上的值 定義f...
遊走 HNOI2013 期望Dp 高斯消元
vjudge 乙個無向連通圖,頂點從1編號到n,邊從1編號到m。小z在該圖上進行隨機遊走,初始時小z在1號頂點,每一步小z以相等的概率隨機選 擇當前頂點的某條邊,沿著這條邊走到下乙個頂點,獲得等於這條邊的編號的分數。當小z 到達n號頂點時遊走結束,總分為所有獲得的分數之和。現在,請你對這m條邊進行編...
高斯消元與期望DP
高斯消元可以解決一系列dp序混亂的無向圖上 期望 dp dp序是一道dp的所有狀態的乙個排列,使狀態x所需的所有前置狀態都位於狀態x前 通俗的說,在乙個狀態轉移方程中 左側的狀態應該在 右側的所有狀態之後 於是往往只有按dp序轉移狀態,才可以保證每個狀態值的正確性 一道dp的狀態序不是唯一的 常見的...