Sol

期望DP+高斯消元.

根据本题题意列出期望方程
\[E(i,j)=(1-p_i)(1-p_j)E(u,v)+(1-p_i)p_jE(u,j)+p_i(1-p_j)E(i,v)+p_ip_jE(i,j),u\in Edge(i,u),v\in Edge(j,v)\]
移项得
\[(1-p_i)(1-p_j)E(u,v)+(1-p_i)p_jE(u,j)+p_i(1-p_j)E(i,v)+(p_ip_j-1)E(i,j)=0,u\in Edge(i,u),v\in Edge(j,v)\]

然后就可以高斯消元了,特殊的因为至少走一步所以关于 \(E(s,t)\) 的方程
\[(1-p_i)(1-p_j)E(u,v)+(1-p_i)p_jE(u,j)+p_i(1-p_j)E(i,v)+(p_ip_j-1)E(i,j)+1=0,u\in Edge(i,u),v\in Edge(j,v)\]

Code

/**************************************************************
Problem: 3270
User: BeiYu
Language: C++
Result: Accepted
Time:376 ms
Memory:3104 kb
****************************************************************/ #include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
#define H(i,j) (i*n+j)
inline int in(int x=0,char ch=getchar()){ while(ch>'9'||ch<'0') ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x; }
const int N = 22;
int n,m,s,t;bool b[N][N];
double p[N],a[N*N][N*N];int du[N];
void init(){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int u=0;u<n;u++) if(b[i][u])
for(int v=0;v<n;v++) if(b[j][v]&&u!=v){
int h1=H(i,j),h2=H(u,v);
if(i==u&&j==v) a[h1][h2]+=p[u]*p[v];
else if(i==u) a[h1][h2]+=p[u]*(1-p[v])/du[v];
else if(j==v) a[h1][h2]+=(1-p[u])*p[v]/du[u];
else a[h1][h2]+=(1-p[u])*(1-p[v])/du[u]/du[v];
}
for(int i=0;i<n*n;i++) a[i][i]-=1;
} void gauss(int n){
for(int i=0,r,j,k;i<n;i++){
for(r=i,j=i+1;j<n;j++) if(fabs(a[r][i])<fabs(a[j][i])) r=j;
if(r!=i) for(j=0;j<=n;j++) swap(a[r][j],a[i][j]);
for(j=i+1;j<n;j++){
double bas=a[j][i]/a[i][i];
for(k=i;k<=n;k++) a[j][k]-=bas*a[i][k];
}
}
for(int i=n-1;~i;i--){
for(int j=i+1;j<n;j++) a[i][n]-=a[j][n]*a[i][j];
a[i][n]/=a[i][i];
}
} int main(){
n=in(),m=in(),s=in()-1,t=in()-1;
for(int i=1,u,v;i<=m;i++) u=in()-1,v=in()-1,b[u][v]=b[v][u]=1,du[u]++,du[v]++;
for(int i=0;i<n;i++) scanf("%lf",&p[i]),b[i][i]=1;
a[H(s,t)][n*n]=-1;init();
// for(int i=0;i<n*n;i++)
// for(int j=0;j<=n*n;j++)
// printf("%.6lf%c",a[i][j]," \n"[j==n*n]);
// putchar('\n');
gauss(n*n);
// for(int i=0;i<n*n;i++)
// for(int j=0;j<=n*n;j++)
// printf("%.6lf%c",a[i][j]," \n"[j==n*n]);
// putchar('\n');
for(int i=0;i<n;i++) printf("%.6lf ",a[H(i,i)][n*n]);
return 0;
}

  

BZOJ 3270: 博物馆的更多相关文章

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

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

  2. ●BZOJ 3270 博物馆

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3270题解: 期望DP,高斯消元 本来是定义的关于概率的dp, 但是发现这样定义有很多解释不通 ...

  3. bzoj 3270 博物馆(高斯消元)

    [题意] 两人起始在s,t点,一人pi概率选择留在i点或等概率移动,问两人在每个房间相遇的概率. [思路] 把两个合并为一个状态,(a,b)表示两人所处的状态,设f[i]为两人处于i状态的概率.则有转 ...

  4. BZOJ 3270 博物馆 && CodeForces 113D. Museum 期望概率dp 高斯消元

    大前提,把两个点的组合看成一种状态 x 两种思路 O(n^7) f[x]表示在某一个点的前提下,这个状态经过那个点的概率,用相邻的点转移状态,高斯一波就好了 O(n^6) 想象成臭气弹,这个和那个的区 ...

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

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

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

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

  7. BZOJ 3270: 博物馆 概率与期望+高斯消元

    和游走挺像的,都是将概率转成期望出现的次数,然后拿高斯消元来解. #include <bits/stdc++.h> #define N 23 #define setIO(s) freope ...

  8. BZOJ 3270 && BZOJ 1778 (期望DP && 高斯消元)

    BZOJ 3270 :设置状态为Id(x,y)表示一人在x,一人在y这个状态的概率. 所以总共有n^2种状态. p[i]表示留在该点的概率,Out[i]=(1-p[i])/Degree[i]表示离开该 ...

  9. 「BZOJ 3270」博物馆「高斯消元」

    应该算高斯消元经典题了吧. 题意:一个无向连通图,有两个人分别在\(s,t\),若一个人在\(u\),每一分钟有\(p[u]\)的概率不动,否则随机前往一个相邻的结点,求在每个点相遇的概率 题解: 首 ...

随机推荐

  1. easyUI validatebox设置值和获取值,以及属性和方法

    一:表单元素使用easyui时,textbox和validatebox设置值和获取值的方式不一样[转] 1.为text-box设置值只能使用id选择器选择表单元素,只能使用textbox(" ...

  2. JS中的 公有变量、私有变量 !

    公有变量.私有变量 ! 初学者的见解,算是记录学习过程,也算是分享以便共同成长,如有不正确的地方,还请不吝赐教! 先看代码1: function car(){ var wheel = 3; //私有变 ...

  3. RL中“#” “?” &“”号的作用

    阅读目录 1. # 2. ? 3. & 回到顶部 1. # 10年9月,twitter改版.一个显著变化,就是URL加入了"#!"符号.比如,改版前的用户主页网址为http ...

  4. Saltstack grains组件

    grains是Saltstack最重要的组件之一,grains的作用是收集被控主机的基本信息,这些信息通常都是一些静态的数据,包括CPU.内核.操作系统.虚拟化等,在服务器端可以根据这些信息进行灵活定 ...

  5. SSL、OPENSSL、SSH、OPENSSH

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议.TLS与 ...

  6. Mysql利用mysql_multi配置一台主机多个实例(转)

    在Mysql官方帮助文档中,详细记录中Mysql的启动方式,有mysqld_safe.mysql.server.mysql_multi这三种.关于mysql_multi的介绍: Mysqld_mult ...

  7. monit 监控并自动重启服务

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://coolerfeng.blog.51cto.com/133059/50126 Mo ...

  8. Method Swizzling (方法调配)

    Method Swizzling是改变一个selector的实际实现的技术.通过这一技术,我们可以在运行时通过修改类的分发表中selector对应的函数,来修改方法的实现. 例如,我们想跟踪在程序中每 ...

  9. Linux操作、hadoop和sh脚本小结

    近期一直在忙项目上的事情,今天对以前的工作做一个简单的小结.明天就是国庆节啦. 1  脚本可以手动执行,可是crontab缺总是找不到路径? #!/bin/bash. /etc/profile . / ...

  10. 修改PUTTY支持保存密码

    1.从官网下载 Putty 0.60 Release 的 Windows 版源码 http://www.chiark.greenend.org.uk/~sgtatham/putty/download. ...