博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】1778: [Usaco2010 Hol]Dotp 驱逐猪猡
阅读量:6089 次
发布时间:2019-06-20

本文共 1791 字,大约阅读时间需要 5 分钟。

【题意】给定无向图,炸弹开始在1,在每个点爆炸概率Q=p/q,不爆炸则等概率往邻点走,求在每个点爆炸的概率。n<=300。

【算法】概率+高斯消元

【题解】很直接的会考虑假设每个点爆炸的概率,无法转移。每个点不爆炸的概率,也无法转移。

因为爆炸概率相同,那么每个点爆炸的概率应该和到达该点的概率正相关。(另一种思路是和到达次数正相关)

设f[x]表示炸弹到达点x的概率(之前不爆炸)。

考虑枚举点x的下一步,发现无法用点y的概率来转移(因为f[y]可能由别的路走到)。

考虑枚举点x的上一步,根据全概率公式P(A)=P(Bi)*P(A|Bi):

$$f[x]=\sum_{y}\frac{f[y]*(1-Q)}{out[y]} \ \ , \ \ y \rightarrow x$$

理解:依赖于每一个可以到达x的点y,P(Bi)就是f[y],在到达y的前提下到达x的概率就是P(A|Bi)=(1-Q)/out[y]。

(另一种理解,依赖于每一条可以到达x的边,P(Bi)=f[y]*(1-Q)/out[y],P(A|Bi)=1)

特别的,点1还可以从天而降(概率为1),所以f[1]++

最后ans[x]=f[x]*Q。或者根据炸弹最终爆炸概率为1,算Σf[i]后均分概率。

此题还可以计算每个点到达的期望次数,也是正相关。

#include
#include
#include
#include
using namespace std;const int maxn=310;long double a[maxn][maxn];int n,m,pp,qq,out[maxn];void gauss(){ for(int i=1;i
fabs(a[r][i]))r=j;// if(r!=i)for(int j=i;j<=n+1;j++)swap(a[r][j],a[i][j]); for(int j=i+1;j<=n;j++){ for(int k=n+1;k>=i;k--){ a[j][k]-=a[j][i]/a[i][i]*a[i][k]; } } } for(int i=n;i>=1;i--){ for(int j=i+1;j<=n;j++)a[i][n+1]-=a[i][j]*a[j][n+1]; a[i][n+1]/=a[i][i]; }}int main(){ int pp,qq; long double Q; scanf("%d%d%d%d",&n,&m,&pp,&qq); Q=1.0*pp/qq; for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); a[v][u]+=(1-Q); if(u!=v)a[u][v]+=(1-Q); out[u]++;out[v]++; } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++)if(out[j])a[i][j]=a[i][j]/out[j]; a[i][i]--; } a[1][n+1]=-1; gauss(); for(int i=1;i<=n;i++)printf("%.9Lf\n",a[i][n+1]*Q+(1e-13));/// return 0;}
View Code

 

注意:

1.高斯消元过程中每次要找绝对值最大的主元,这是为了避免除零,提高精度。

2.涉及负数的浮点数最后要避免-0,加eps

转载于:https://www.cnblogs.com/onioncyc/p/7613829.html

你可能感兴趣的文章
找不到com.apple.Boot.plist
查看>>
使用openssl创建自签名证书及部署到IIS教程
查看>>
入门视频采集与处理(学会分析YUV数据)
查看>>
java keytool详解
查看>>
记一次Redis被攻击的事件
查看>>
Debian 的 preinst, postinst, prerm, 和 postrm 脚本
查看>>
socket编程的select模型
查看>>
IDEA和Eclipse经常使用快捷键(Win Mac)
查看>>
ubutntu apt 源
查看>>
PHP 文件处理
查看>>
cesium之核心类Viewer简介篇
查看>>
ALSA声卡驱动中的DAPM详解之六:精髓所在,牵一发而动全身
查看>>
libev与libuv的区别
查看>>
iOS 为什么使用xcode8上传app包到appStore无法构建版本
查看>>
Tomcat优化步骤【转】
查看>>
CRC 自动判断大端 小端
查看>>
原来这样可以轻松恢复回收站删除文件
查看>>
DisparityCostVolumeEstimator.cpp
查看>>
(转)git中关于fetch的使用
查看>>
mongo DB for C#
查看>>