【期望DP+高斯消元】BZOJ3270-博物馆
【题目大意】
有m条走廊连接的n间房间,并且满足可以从任何一间房间到任何一间别的房间。两个男孩现在分别处在a,b两个房间,每一分钟有Pi 的概率在这分钟内不去其他地方(即呆在房间不动),有1-Pi 的概率他会在相邻的房间中等可能的选择一间并沿着走廊过去。求两人在每间房间相遇的概率。
【思路】
向用链表把图建出来,建立的时候不要忘记了自己向自己再加一条边(见下面情况1)
我们将男孩A位于x,男孩B位于y的状态定义为id[x][y]。由id[tx][ty]状态转移到id[i][j]状态的概率。如果当前已经知道了抵达id[i][j]状态的期望概率为F[i,j]。
考虑以下几种可能性:
(1)tx=i且ty=j,说明两者都停留在原地不动,概率为Ptx*Pty*F[i,j];
(2)tx=i且ty≠j,说明男孩B移动了而男孩A没有,概率为Ptx*((1-Pty)/Dty)*F[i,ty],其中Dty为ty的出度;
(3)tx≠i且ty=j,概率为Pty*((1-Ptx)/Dtx)*F[tx,j];
(4)tx≠i且ty≠j,概率为((1-Ptx)/Dtx)*F[i,ty]*((1-Pty)/Dty)*F[tx,j]。
我们把F看成是未知数,它们前面乘上的看作是系数,对于F[i,j]可以列出以下方程:
F[i,j]=情况(1)+情况(2)+情况(3)+情况(4)。
0=(Ptx*Pty-1)*F[i,j]+情况(2)+情况(3)+情况(4)……(*)
如上 (*)式子总共可以列出n*n个。有一个特例是在其实位置,也就是F(a,b),由于一开始就位于id[a][b],也就是说初始时概率就为1了,所以在(*)右边还要加上1,移到等式左边就变成了-1,所以有a[id[aa][bb]][n*n+1]=-1。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
const int MAXN=+;
double f[MAXN*MAXN][MAXN*MAXN],p[MAXN];
int id[MAXN][MAXN];
vector<int> E[MAXN];
double a[MAXN*MAXN][MAXN*MAXN];
int n,m,aa,bb; void init()
{
scanf("%d%d%d%d",&n,&m,&aa,&bb);
int cnt=;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) id[i][j]=++cnt;
a[id[aa][bb]][n*n+]=-;
for (int i=;i<=n;i++) E[i].push_back(i);//不要忘记把自己向自己是可以走的
for (int i=;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
E[u].push_back(v);
E[v].push_back(u);
}
for (int i=;i<=n;i++) scanf("%lf",&p[i]);
} void buildequ()
{
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
{
a[id[i][j]][id[i][j]]--;//位于方程右边系数为1,移到左边系数变成-1
for (int x=;x<E[i].size();x++)
for (int y=;y<E[j].size();y++)
{
int tx=E[i][x],ty=E[j][y];
int fr=id[i][j],to=id[tx][ty];
if (tx!=ty)
{
if (tx==i && ty==j) a[fr][to]+=p[tx]*p[ty];//停留在原地不动
else if (tx==i) a[fr][to]+=p[tx]*(-p[ty])/(E[ty].size()-);
else if (ty==j) a[fr][to]+=p[ty]*(-p[tx])/(E[tx].size()-);
else a[fr][to]+=(-p[tx])*(-p[ty])/(E[ty].size()-)/(E[tx].size()-);
}
}
}
} void guass()
{
for (int i=;i<=n*n;i++)
{
int t=i;
for (int j=i+;j<=n*n;j++) if (fabs(a[j][i])>fabs(a[t][i])) t=j;
if (t!=i) for (int j=i;j<=n*n+;j++) swap(a[i][j],a[t][j]);//不要忘记要到n*n+1
for (int j=i+;j<=n*n;j++)
{
double x=a[j][i]/a[i][i];
for (int k=i;k<=n*n+;k++) a[j][k]-=a[i][k]*x;
}
}
for (int i=n*n;i>=;i--)
{
for (int j=i+;j<=n*n;j++) a[i][n*n+]-=a[i][j]*a[j][n*n+];
a[i][n*n+]/=a[i][i];
}
} void printans()
{
for (int i=;i<=n;i++) printf("%.6lf ",a[id[i][i]][n*n+]);
} int main()
{
init();
buildequ();
guass();
printans();
return ;
}
【期望DP+高斯消元】BZOJ3270-博物馆的更多相关文章
- BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元
BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...
- HDU 2262 Where is the canteen 期望dp+高斯消元
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2262 Where is the canteen Time Limit: 10000/5000 MS ...
- hdu4418 Time travel 【期望dp + 高斯消元】
题目链接 BZOJ4418 题解 题意:从一个序列上某一点开始沿一个方向走,走到头返回,每次走的步长各有概率,问走到一点的期望步数,或者无解 我们先将序列倍长形成循环序列,\(n = (N - 1) ...
- 【noi2019集训题1】 脑部进食 期望dp+高斯消元
题目大意:有n个点,m条有向边,每条边上有一个小写字母. 有一个人从1号点开始在这个图上随机游走,游走过程中他会按顺序记录下走过的边上的字符. 如果在某个时刻,他记录下的字符串中,存在一个子序列和S2 ...
- LightOJ 1151 Snakes and Ladders 期望dp+高斯消元
题目传送门 题目大意:10*10的地图,不过可以直接看成1*100的,从1出发,要到达100,每次走的步数用一个大小为6的骰子决定.地图上有很多个通道 A可以直接到B,不过A和B大小不确定 而且 ...
- P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】
正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为\(n\),剩余\(hp\)点生命,然后每个时刻如果生命值没有满那么有\( ...
- ZJUT 1423 地下迷宫(期望DP&高斯消元)
地下迷宫 Time Limit:1000MS Memory Limit:32768K Description: 由于山体滑坡,DK被困在了地下蜘蛛王国迷宫.为了抢在DH之前来到TFT,DK必须尽快走 ...
- Codeforces.24D.Broken robot(期望DP 高斯消元)
题目链接 可能这儿的会更易懂一些(表示不想再多写了). 令\(f[i][j]\)表示从\((i,j)\)到达最后一行的期望步数.那么有\(f[n][j]=0\). 若\(m=1\),答案是\(2(n- ...
- HDU4418 Time travel(期望dp 高斯消元)
题意 题目链接 Sol mdzz这题真的太恶心了.. 首先不难看出这就是个高斯消元解方程的板子题 \(f[x] = \sum_{i = 1}^n f[to(x + i)] * p[i] + ave\) ...
- [BZOJ3150][Ctsc2013]猴子 期望dp+高斯消元
3150: [Ctsc2013]猴子 Time Limit: 20 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 163 Solved: 10 ...
随机推荐
- margin 居中
左右auto加个宽度.margin-left: auto; margin-right: auto; width:640px;
- bzoj 1406 数论
首先问题的意思就是在找出n以内的所有x^2%n=1的数,那么我们可以得到(x+1)(x-1)=y*n,那么我们知道n|(x+1)(x-1),我们设n=a*b,那么我们对于任意的a,我们满足n%a==0 ...
- AndroidStudio获得发布版安全码SHA1
耗了一下午才搞定 在cmd中: 1.打开keytool的目录:即JDK的安装目录 2.输入口令: (E:\tenyears\tenyears\app是keystore文件的目录)
- [NOIP2011]刷水
前几天做了NOIP2011的题,感觉不是那么难. 这边先做了两天的前两题,T3还没打. D1T1:顺次读入,分别判断是否覆盖即可,照例大水: #include<cstdio> ],b[], ...
- perl6中的替换
use v6; =begin pod perl6 中的替换用S/// S有几个可选参数: :g —(长形式::global)全局匹配:替换掉所有的出现 :i —不区分大小写的匹配 :ii —(长形式: ...
- hadoop InputFormat 类别
FileInputFormat是所有使用文件作为数据源的InputFormat的积累.它提供两个功能:一个是定义哪些文件包含在一个作业的输入中:一个为输入文件生成分片的实现.自动将作业分块 作业分块大 ...
- .build_release/lib/libcaffe.so: undefined reference to `cv::VideoCapture::set(int, double)'
CXX/LD -o .build_release/tools/convert_imageset.bin.build_release/lib/libcaffe.so: undefined referen ...
- NFS+inotify实时同步
Inotify简介 Inotify是一种文件系统事件通告机制,能够实时监控文件系统下文件的访问.修改.删除等各种变化情况并将其作为事件通告给用户态应用程序.Linux内核从2.6.13版本后已经集成了 ...
- Android端与Android端利用WIFI进行FTP通信
一.客户端通信工具类: import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; im ...
- 判断ArcSDE是否安装成功
安装SDE后在ArcMap的Toolboxes - Data Management Tools中会新增Geodatabase Administration 即数据管理工具下面会新增地理数据库管理