博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Luogu P2973&BZOJ 1778][USACO10HOL]赶小猪DOtP(高斯消元+期望)
阅读量:6386 次
发布时间:2019-06-23

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

Description

一个无向图,节点1有一个炸弹,在每个单位时间内,有可能在这个节点炸掉,也有p/q的概率随机选择一条出去的路到其他的节点上。问最终炸弹在每个节点上爆炸的概率。

Solution

没错它就是BZOJ 1778…在bzoj上是权限题

炸弹最终爆炸的概率是1(可能是在无穷无尽的时间之后…),于是到达某一点的概率除以到达所有点的概率就是在这个节点上爆炸的概率

f[u]=∑f[v]*(1-p/q)/d[v]

#include
#include
#include
#include
using namespace std;int n,m,d[303],head[303],cnt=0;double a[303][303],f[303],p,q;struct Node{ int next,to;}Edges[100005];void addedge(int u,int v){ Edges[++cnt].next=head[u]; head[u]=cnt; Edges[cnt].to=v;}void Gauss(){ for(int i=1;i<=n;i++) { int maxline=i; for(int j=i;j<=n;j++) if(a[j][i]>a[maxline][i])maxline=j; if(maxline!=i) for(int j=i;j<=n+1;j++) swap(a[maxline][j],a[i][j]); for(int j=i+1;j<=n;j++) { double t=a[j][i]/a[i][i]; for(int k=i;k<=n+1;k++) a[j][k]-=t*a[i][k]; } } for(int i=n;i>0;i--) { for(int j=n;j>i;j--) a[i][n+1]-=f[j]*a[i][j]; f[i]=a[i][n+1]/a[i][i]; }}int main(){ memset(head,-1,sizeof(head)); scanf("%d%d%lf%lf",&n,&m,&p,&q); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); addedge(u,v); addedge(v,u); d[u]++,d[v]++; } for(int i=1;i<=n;i++) { a[i][i]+=1; for(int j=head[i];~j;j=Edges[j].next) { int v=Edges[j].to; a[v][i]-=(1-p/q)/d[i]; } } a[1][n+1]+=1-p/q; Gauss(); double sum=0; for(int i=1;i<=n;i++)sum+=f[i]; for(int i=1;i<=n;i++) printf("%.9lf\n",f[i]/sum); return 0;}

 

转载于:https://www.cnblogs.com/Zars19/p/6820394.html

你可能感兴趣的文章
针对异常的微信支付开发 坚守两大原则(分享)
查看>>
ExtJs4发送同步请求的store
查看>>
恶意邮件假冒系统安全公告发送病毒,通过个人签名数字证书排除不明邮件干扰...
查看>>
linux内核编译
查看>>
Object-C - 类的定义
查看>>
小程序-动态设置顶部导航条
查看>>
c++ inline 的位置不当导致的 无法解析的外部符号
查看>>
HLG 1460 Highway Construction【树的直径】
查看>>
linux死锁检测的一种思路【转】
查看>>
找出和为某个数的连续正整数序列
查看>>
设计模式总结(Java)—— 观察者模式
查看>>
js for in
查看>>
MySQL抓包工具:MySQL Sniffer
查看>>
Vuex 学习总结
查看>>
C# 代码注释规范文档
查看>>
玩转Android之在线视频播放控件Vitamio的使用
查看>>
H264 NALU 使用PS封装 RTP发送
查看>>
PYTHON编码处理-str与Unicode的区别
查看>>
Python(五)之迭代器和列表解析
查看>>
Dockerfile 最佳实践
查看>>