http://www.lydsy.com/JudgeOnline/problem.php?id=3270


题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$,走的话等概率走到相邻的点,求两人在每个点相遇的概率
对于100%的数据有 n <= 20,n-1 <= m <= n(n-1)/2


因为两个人,所以状态肯定要二元组
$f(i,j)$表示一人在$i$另一人在$j$的概率,转移方程:
$f(i,j)=f(i,j)p_ip_j-\sum\limits_{(x,i)\ ,\ (y,j) \in E}{f(x,i)p_jt_x+f(i,y)p_it_y+f(x,y)t_xt_y}$
$t_i=\frac{1-p_i}{d_i}$
然后有环没法$DP$.....
高斯消元解方程...$n^2$个方程$n^2$个变量

注意:
$1.$ $f(i,i)$不能走到其他啦(也不能不走啦)
$2.$ 一开始$f(x,y)$的概率除了走出来的左面还要加上$1$,因为一开始一定在$(x,y)$

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=,M=;
inline int read(){
char c=getchar();int x=;
while(c<''||c>''){c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x;
}
int n,m,x,y,u,v,nn;
int d[N];
double p[N],a[N][N];
inline int id(int i,int j){return (i-)*n+j;}
struct edge{
int v,ne;
}e[M<<];
int h[N],cnt=;
inline void ins(int u,int v){
cnt++;
e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;
cnt++;
e[cnt].v=u;e[cnt].ne=h[v];h[v]=cnt;
}
double t[N];
void buildEquation(){
for(int i=;i<=n;i++) t[i]=(-p[i])/d[i];
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
int num=id(i,j);double *g=a[num];
if(i==j) g[num]=;
else g[num]=-p[i]*p[j];
int x,y;
for(int k=h[i];k;k=e[k].ne){
x=e[k].v;
if(x!=j) g[id(x,j)]=-p[j]*t[x];
}
for(int k=h[j];k;k=e[k].ne){
y=e[k].v;
if(y!=i) g[id(i,y)]=-p[i]*t[y];
}
for(int k=h[i];k;k=e[k].ne)
for(int l=h[j];l;l=e[l].ne){
x=e[k].v,y=e[l].v;
if(x!=y) g[id(x,y)]=-t[x]*t[y];
}
}
a[id(x,y)][nn+]=;
}
void GaussElimination(int n){
for(int i=;i<=n;i++){
int r=i;
for(int j=i+;j<=n;j++)
if(abs(a[j][i])>abs(a[r][i])) r=j;
if(r!=i) for(int k=;k<=n+;k++) swap(a[i][k],a[r][k]); for(int j=i+;j<=n;j++){
double t=a[j][i]/a[i][i];
for(int k=i;k<=n+;k++) a[j][k]-=a[i][k]*t;
}
}
for(int i=n;i>=;i--){
for(int j=n;j>i;j--) a[i][n+]-=a[j][n+]*a[i][j];
a[i][n+]/=a[i][i];
}
}
int main(){
freopen("in","r",stdin);
n=read();m=read();nn=n*n;
x=read();y=read();
for(int i=;i<=m;i++)
u=read(),v=read(),ins(u,v),d[u]++,d[v]++;
for(int i=;i<=n;i++) scanf("%lf",&p[i]);
buildEquation();
GaussElimination(nn);
for(int i=;i<=n;i++) printf("%.6lf ",a[id(i,i)][nn+]);
}

BZOJ 3270: 博物馆 [概率DP 高斯消元]的更多相关文章

  1. BZOJ 3270 博物馆 ——概率DP 高斯消元

    用$F(i,j)$表示A在i,B在j的概率. 然后很容易列出转移方程. 然后可以高斯消元了! 被一个问题困扰了很久,为什么起始点的概率要加上1. (因为其他博客上都是直接写成-1,雾) 考虑初始状态是 ...

  2. bzoj 3270: 博物馆【dp+高斯消元】

    好像是高斯消元解互相推(?)的dp的例子 首先考虑dp,设f[i][j]为一人在i一人在j的概率,点i答案显然就是f[i][i]: 然后根据题意,得到转移是 \[ f[i][j]=f[i][j]*p_ ...

  3. 【BZOJ3270】博物馆 概率DP 高斯消元

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

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

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

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

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

  6. LightOJ - 1151概率dp+高斯消元

    概率dp+高斯消元 https://vjudge.net/problem/LightOJ-1151 题意:刚开始在1,要走到100,每次走的距离1-6,超过100重来,有一些点可能有传送点,可以传送到 ...

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

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

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

    [BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ...

  9. 【概率dp 高斯消元】bzoj3270: 博物馆

    一类成环概率dp的操作模式 Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n ...

随机推荐

  1. mysql常用的提权方法

    一,利用MOF提权 Windows 管理规范 (WMI) 提供了以下三种方法编译到 WMI 存储库的托管对象格式 (MOF) 文件: 方法 1: 运行 MOF 文件指定为命令行参数将 Mofcomp. ...

  2. [国嵌攻略][104][Linux内核模块设计]

    内核模块示例 #inlcude <linux/init.h> #inlcude <linux/module.h> static int hello_init(){ printk ...

  3. Python数据类型一:数字与运算符

    数字 一.数值类型 python中支持的数值类型有以下几种: 1.整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点.Python3 整型是没有限制大小的,可以当作 Long 类型使 ...

  4. insertBefore方法(javascript与jQuery)

    说到insertBefore()方法,其实javascript与jQuery中都有此方法,那么他们用法是否相同呢? 其实,还是有点区别的.反正我是爱搞混淆了,先做个小笔记吧! 1.insertBefo ...

  5. Oracle:FOR循环语句练习

    --打印输出从1到10的正整数DECLARE v_i NUMBER(10) := 0;BEGIN LOOP v_i := v_i + 1; DBMS_OUTPUT.put_line(v_i); EXI ...

  6. putty 与winscp 区别

    https://zhidao.baidu.com/question/377968180.html putty 与winscp 有什么区别, 装了 winscp 可以由 putty 替换么 ? 具体用法 ...

  7. 用Dedecms5.7的arclist标签调用文章内容

    arclist标签调用文章内容 首先大家都知道在Dedecms中,list标签是可以调用文章内容的,调用格式就不再此冗述了.从我个人来说,我非常不喜欢用list标签调用,有可能我会尽量使用arclis ...

  8. kafka和strom集群的环境安装

    前言 storm和kafka集群安装是没有必然联系的,我将这两个写在一起,是因为他们都是由zookeeper进行管理的,也都依赖于JDK的环境,为了不重复再写一遍配置,所以我将这两个写在一起.若只需一 ...

  9. 通过自定义的URL Scheme启动你的App

    iPhone SDK可以把你的App和一个自定义的URL Scheme绑定.该URL Scheme可用来从浏览器或别的App启动你的App. 如何响应从别的App里发给你的URL Scheme申请,由 ...

  10. python_如何对迭代器进行切片操作

    案例: 对于某个文件,我只想读取到其中100~200行之间的内容,是否可以通过切片的方式进行读取? 我想: f = open() f[100:200] 可行? 如何解决这个问题? 方法1: 全部读取到 ...