题意:一张 nnn 个点的无向连通图,两个人开始时分别在 a,ba,ba,b。每次在 uuu 时会以 ppp 的概率原地不动,1−p1-p1−p 的概率等概率随机选择到一个相邻的点,当两人在同一点时停止。分别求在每个点相遇的概率。

n≤22n\leq 22n≤22

网上一堆 “从起点走到 (i,j)(i,j)(i,j) 的概率”,看得我一脸懵逼……

很容易分析出转移矩阵 MMM,然后相当于求这个东西:

lim⁡t→+∞MtV\lim_{t\to +\infin}M^{t}Vt→+∞lim​MtV

但这个并没有通用的求法,因为矩阵的特征向量有无数多个。

算法一

比较直观的解法。

设 f(i,j)f(i,j)f(i,j) 表示 (i,j)(i,j)(i,j) 这个状态到达次数的期望,即这个状态在所有世界线中出现次数的平均值。

由于最终点只有可能出现 000 次或 111 次,所以它的期望次数就是概率。

而这个期望随便消一下就可以算出来。

算法二

比较本质的解法。

考虑枚举一个最终状态 (s,s)(s,s)(s,s),在此条件下求 f(i,j)f(i,j)f(i,j) 表示最终到这个状态的概率,令 f(i,i)=[i=s]f(i,i)=[i=s]f(i,i)=[i=s],就可以消元了。但这样是 O(n7)O(n^7)O(n7) 的,无法通过。

考虑一次性把每个点作为终点的 nnn 个答案算出来,即构建出 (n2−n)×(n2)(n^2-n)\times (n^2)(n2−n)×(n2) 的矩阵。这样有 n2n^2n2 个未知数但只有 n2−nn^2-nn2−n 个方程,无法解出,但可以求出 f(a,b)f(a,b)f(a,b) 关于 f(1,1),f(2,2),…,f(n,n)f(1,1),f(2,2),\dots,f(n,n)f(1,1),f(2,2),…,f(n,n) 的线性表达,就可以求出答案了。

复杂度 O(n6)O(n^6)O(n6)

所以算法一算法二以及上面那个假算法写出来都一样的……

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <vector>
using namespace std;
vector<int> e[25];
double p[25],a[505][505];
int n,m,sa,sb;
inline int id(int x,int y)
{if (x==y) return n*n-n+x;return (x-1)*(n-1)+y-(y>x);
}
void gauss(int n,int m)
{for (int i=1;i<=n;i++){int pos=i;for (int j=i+1;j<=n;j++) if (fabs(a[j][i])>fabs(a[pos][i])) pos=j;if (pos>i) swap(a[i],a[pos]);for (int j=1;j<=n;j++)if (j!=i){double t=a[j][i]/a[i][i];for (int k=i;k<=m;k++)a[j][k]-=t*a[i][k];}}
}
int main()
{scanf("%d%d%d%d",&n,&m,&sa,&sb);if (sa==sb){for (int i=1;i<=n;i++) if (i==sa) printf("%.10f ",1.0);else printf("%.10f ",0.0);return 0;}for (int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);e[u].push_back(v),e[v].push_back(u);}for (int i=1;i<=n;i++) scanf("%lf",&p[i]);for (int u=1;u<=n;u++)for (int v=1;v<=n;v++)if (u!=v){int s=id(u,v);double pu=1.0/e[u].size(),pv=1.0/e[v].size();for (int i=0;i<=(int)e[u].size();i++)for (int j=0;j<=(int)e[v].size();j++){double t=(i<(int)e[u].size()? (1-p[u])*pu:p[u])*(j<(e[v].size())? (1-p[v])*pv:p[v]);a[s][id(i<(int)e[u].size()? e[u][i]:u,j<(int)e[v].size()? e[v][j]:v)]=t;}a[s][s]-=1;}gauss(n*n-n,n*n);int s=id(sa,sb);for (int i=n*n-n+1;i<=n*n;i++) printf("%.10f ",-a[s][i]/a[s][s]);return 0;
}

【CF113D】Museum【概率期望】【高斯消元】相关推荐

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

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

  2. 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元

    [题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...

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

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

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

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

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

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

  6. 【BZOJ3640】JC的小苹果 概率DP+高斯消元

    [BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. "你是我的小丫小苹果,怎么爱你都不嫌多!" "点亮我生命的火,火火火火火!&qu ...

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

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

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

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

  9. bzoj1778: [Usaco2010 Hol]Dotp 驱逐猪猡(概率DP+高斯消元)

    深夜肝题...有害身心健康QAQ 设f[i]为到达i的概率,d[i]为i的度数. 因为无限久之后炸弹爆炸的概率是1,所以最后在i点爆炸的概率实际上就是f[i]/sigma(f[]) 列出方程组 f[i ...

  10. 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}的序列,现在裁判开始投掷骰子,并且把每次的 ...

最新文章

  1. python定时任务crontab_【Python】Linux crontab定时任务配置方法(详解)
  2. 第八十期:初创公司5大Java服务困局,阿里工程师如何打破?
  3. Android中已经添加权限,依然提示缺少权限,此时你需要添加动态权限
  4. ACM-Maximum Tape Utilization Ratio
  5. Centos源码安装Python3
  6. kindle DXG 安装多看
  7. Wannafly Winter Camp 2019 Day2 H Cosmic Cleaner (球体相交体积(球冠体积公式))
  8. 普乐蛙4d5d动感影院|VR太空旅行设备|VR带你遨游太空
  9. 白帽子讲Web安全(一)浏览器安全
  10. NLP标签/关键词-提取工具-java开发
  11. 骨骼动画——2D Animation
  12. Three.js 开启带动画模型的动画
  13. 3 什么是linux磁盘分区,3. Linux系统磁盘分区介绍
  14. Maven下载及目录结构
  15. mac搭建win10虚拟机并对磁盘分区
  16. 【转】JS VLC插件
  17. 交通预测论文翻译:Deep Learning on Traffic Prediction: Methods,Analysis and Future Directions
  18. ArcBlock ⑪ 月报 | 无惧寒冬 ABT 2019 区块链远征启程
  19. Lamdba及DataTable AsEnumerable()的使用
  20. springboot处理参数再转发请求_Springboot 2.0---WebFlux请求处理流程

热门文章

  1. python正十三边形_一起学python-opencv十三(直方图反向投影和模板匹配)
  2. @order注解_别再用ifelse了,用注解去代替他吧
  3. 一组动图看懂3D打印原理
  4. 最全高考分数线出炉!!查了分后,这届学生为了过线真是太拼了.......
  5. modbus 台达a2_驱控智造未来 台达重磅发布多款工业自动化新品
  6. java设置窗口不可移动_Java – JDialog不可移动
  7. php大数组查找算法,PHP简单的数组查找算法分享
  8. matlab画孔斯曲面,CAD CAM技术基础:第五讲 孔斯曲面
  9. java字符串拼接例子_Java详解【String】+【StringBuilder vs StringBuffer】+【字符串拼接】...
  10. java读取图片缩略方法_java 图片缩略图的两种方法