【BZOJ3640】JC的小苹果

Description

让我们继续JC和DZY的故事。

“你是我的小丫小苹果,怎么爱你都不嫌多!”

“点亮我生命的火,火火火火火!”

话说JC历经艰辛来到了城市B,但是由于他的疏忽DZY偷走了他的小苹果!没有小苹果怎么听歌!他发现邪恶的DZY把他的小苹果藏在了一个迷宫里。JC在经历了之前的战斗后他还剩下hp点血。开始JC在1号点,他的小苹果在N号点。DZY在一些点里放了怪兽。当JC每次遇到位置在i的怪兽时他会损失Ai点血。当JC的血小于等于0时他就会被自动弹出迷宫并且再也无法进入。

但是JC迷路了,他每次只能从当前所在点出发等概率的选择一条道路走。所有道路都是双向的,一共有m条,怪兽无法被杀死。现在JC想知道他找到他的小苹果的概率。

P.S.大家都知道这个系列是提高组模拟赛,所以这是一道送分题balabala

Input

第一行三个整数表示n,m,hp。接下来一行整数,第i个表示jc到第i个点要损失的血量。保证第1个和n个数为0。接下来m行每行两个整数a,b表示ab间有一条无向边。

Output

仅一行,表示JC找到他的小苹果的期望概率,保留八位小数。

Sample Input

3 3 2
0 1 0
1 2
1 3
2 3

Sample Output

0.87500000

HINT

对于100%的数据 2<=n<=150,hp<=10000,m<=5000,保证图联通。

题解:如果没有Ai=0,直接DP,如果hp很小,直接高斯消元,但是都有,所以用DP+高斯消元。

发现,方程组中只有Ai=0的点有系数,Ai!=0的都可以直接拿过来变成常数项,所以每次我们的方程组只有一列是变化的,所以我们将方程组表示成Ax=b,x=A-1b。x和b都是列向量。所以我们只需要预处理出A的逆,然后每次O(n2)乘一下就行了。

矩阵求逆的方法:先将(A|I)拼一起,然后通过行变换将左边的A消成I,右边剩下的就是A-1

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int n,m,hp;
int dam[160],pa[5010],pb[5010],d[160];
double f[160][10000],B[160],ans;
struct M
{double v[160][160];M (){memset(v,0,sizeof(v));}double* operator [](int x) {return v[x];}void I(){for(int i=1;i<=n;i++)  for(int j=1;j<=n;j++)    v[i][j]=(i==j)?1:0;}M getinv(){int i,j,k;M re;double t;re.I();for(i=1;i<=n;i++){for(j=i;j<=n;j++)  if(fabs(v[j][i])>fabs(v[i][i]))  for(k=1;k<=n;k++)swap(v[i][k],v[j][k]),swap(re[i][k],re[j][k]);t=v[i][i];for(j=1;j<=n;j++)   v[i][j]/=t,re[i][j]/=t;for(j=1;j<=n;j++)   if(i!=j){t=v[j][i];for(k=1;k<=n;k++)   v[j][k]-=t*v[i][k],re[j][k]-=t*re[i][k];}}return re;}void operator * (int x){for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)    f[i][x]+=v[i][j]*B[j];}
};
M A,A1;
int rd()
{int ret=0,f=1;   char gc=getchar();while(gc<'0'||gc>'9')  {if(gc=='-')f=-f;  gc=getchar();}while(gc>='0'&&gc<='9')  ret=ret*10+gc-'0',gc=getchar();return ret*f;
}
int main()
{n=rd(),m=rd(),hp=rd();int i,j;for(i=1;i<=n;i++)  dam[i]=rd();for(i=1;i<=m;i++){pa[i]=rd(),pb[i]=rd();d[pa[i]]++;if(pa[i]!=pb[i])    d[pb[i]]++;}for(i=1;i<=m;i++){if(!dam[pb[i]])  A[pb[i]][pa[i]]-=1.0/d[pa[i]];if(pa[i]==pb[i])   continue;if(!dam[pa[i]])    A[pa[i]][pb[i]]-=1.0/d[pb[i]];}for(i=1;i<=n;i++)    A[i][n]=0;for(i=1;i<=n;i++) A[i][i]++;A1=A.getinv();for(j=hp;j;j--){for(i=1;i<=n;i++)    B[i]=0;if(j==hp) B[1]=1;else    for(i=1;i<=m;i++){if(dam[pb[i]]&&dam[pb[i]]+j<=hp&&pa[i]!=n)   B[pb[i]]+=f[pa[i]][j+dam[pb[i]]]*1.0/d[pa[i]];if(pa[i]==pb[i]) continue;if(dam[pa[i]]&&dam[pa[i]]+j<=hp&&pb[i]!=n)   B[pa[i]]+=f[pb[i]][j+dam[pa[i]]]*1.0/d[pb[i]];}A1*j,ans+=f[n][j];}printf("%.8lf",ans);return 0;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/7054760.html

【BZOJ3640】JC的小苹果 概率DP+高斯消元相关推荐

  1. BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元

    BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...

  2. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

    题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...

  3. BZOJ 3270: 博物馆 1778: 驱逐猪猡 【概率DP+高斯消元】

    题目描述: 中文题面,不多解释.1778传送门 3270 传送门 (博物馆)题目分析: 也许很多人做概率题的时候都有种虚幻感..感觉莫名其妙就得出一个期望.概率,一知半解... 所以我在这里仔细地剖析 ...

  4. BZOJ3270 博物館 概率DP 高斯消元

    BZOJ3270 博物館 概率DP 高斯消元 @(XSY)[概率DP, 高斯消元] Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博 ...

  5. BZOJ 3270: 博物馆 [概率DP 高斯消元]

    http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...

  6. AC自动机 + 概率dp + 高斯消元 --- HDU 5955 or 2016年沈阳icpc H [AC自动机 + 概率dp + 高斯消元]详解

    题目链接 题目大意: 就是有NNN个人,每个人都会猜一个长度为LLL的只包含{1,2,3,4,5,6}\{1,2,3,4,5,6\}{1,2,3,4,5,6}的序列,现在裁判开始投掷骰子,并且把每次的 ...

  7. hdu4418 概率dp+高斯消元(近日吐槽)

    因为过年,好久没更博客了,最近要狂补题解了== 1.做了几天的概率dp,稍后还要写一篇概率dp和期望的总结,当然,下面几天的专题还是概率dp 2.接着还要整理一个漂亮的高斯消元模板= 3.最近打了几场 ...

  8. bzoj 4820: [Sdoi2017]硬币游戏 概率dp+高斯消元+KMP

    题意 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利. 大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了. 同学们觉得要加强趣味性,所以要找一个同学扔很多 ...

  9. [BZOJ5292][BJOI2018]治疗之雨(概率DP+高斯消元)

    https://blog.csdn.net/xyz32768/article/details/83217209 不难找到DP方程与辅助DP方程,发现DP方程具有后效性,于是高斯消元即可. 但朴素消元显 ...

最新文章

  1. maven 使用 问题记录
  2. TF之DNN:利用DNN【784→500→10】对MNIST手写数字图片识别数据集(TF自带函数下载)预测(98%)+案例理解DNN过程
  3. socket绑定的ip为INADDR_ANY 的意义 htonl(INADDR_ANY)(0.0.0.0所有地址、不确定地址、任意地址)(htonl和htons区别)
  4. Charles 抓包 从入门到精通
  5. MicroRNA Ranking(Tehran2016)
  6. VS2015上配置opencv2.4.11
  7. jqGrid添加详细按钮,单击弹出窗体
  8. 2018达内web全套视频
  9. java抽象类的属性_JAVA 抽象类
  10. Edge浏览器运行卡顿怎么办 怎样让Edge浏览器速度更快
  11. 画一个神经元的结构简图,神经元的简图画法
  12. App如何在background状态下存活
  13. NeuralPS2021下载~论文总结~NeurlPS2021论文pdf
  14. 半监督学习模型: 半监督的SVM
  15. GB/T 7714-2005参考文献规范[转]
  16. docker-compose和docker swarm容器间网络不互通的情况
  17. 四大渲染农场渲染价格对比
  18. 信号与系统陈后金matlab,信号与系统(陈后金)_MATLAB.ppt
  19. 虚拟光驱dameon tools 残留 文件catch!删除方法
  20. SAP ABAP 接口开发(RFC,IDOC,Webservice,Native SQL)

热门文章

  1. Phaser开源2d引擎 javascript/html5游戏框架
  2. flash特效原理:图片滑动放大效果(2)
  3. 测试一体机ASM failgroup的相关问题处理
  4. socket编程初级
  5. PHP中封装mysql数据库链接(简单版)
  6. Nodejs从小工到专家系列(一)
  7. 局域网内连接MySQL
  8. jquery ui autocomplete输入中文不自动完成的问题
  9. HDU 下沙的沙子有几粒
  10. 本机获取Intel AMT IP地址的例子