【期望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 ...
随机推荐
- leetcode 之Candy(12)
这题的思路很巧妙,分两遍扫描,将元素分别和左右元素相比较. int candy(vector<int> &rattings) { int n = rattings.size(); ...
- python_day3学习笔记
set集合 python的set是一个无序不重复元素集,基本功能包括关系测试和消除重复元素. 集合对象还支持并.交.差.对称差等. sets 支持 x in set. len(set).和 for x ...
- selenium+python自动化78-autoit参数化与批量上传【转载】
转至博客:上海-悠悠 前言前一篇autoit实现文件上传打包成.exe可执行文件后,每次只能传固定的那个图片,我们实际测试时候希望传不同的图片.这样每次调用的时候,在命令行里面加一个文件路径的参数就行 ...
- <一>dubbo框架学前原理介绍
alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo.hsf),jms消息服务(napoli.notify),KV数据库(tair)等.这个框架/工具/产 ...
- [你必须知道的.NET]第二十八回:说说Name这回事儿
发布日期:2009.3.18 作者:Anytao © 2009 Anytao.com ,原创作品,转贴请注明作者和出处. 1 缘起 老赵在谈表达式树的缓存(2):由表达式树生成字符串中提到,在描述Ty ...
- Linux下安装PHP环境(非集成)
一.安装Apache1.到官网下载 http://httpd.apache.org/download.cgi 2.安装apache [root@localhost 52lamp]# mkdir ...
- Delphi使程序的窗口出现在最前面并激活
procedure setAppFront(); //使程序的窗口出现在最前面并激活 var pt, OldPt, NewPt: TPoint; begin //判断Application是否最小化, ...
- AC日记——「SCOI2016」背单词 LiBreOJ 2012
#2012. 「SCOI2016」背单词 思路: Orz: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...
- javascript高程笔记:逻辑与和逻辑或
逻辑与和或 逻辑与 当 && 前后两个操作数都是布尔值,无可厚非,同时为true才为true.与其他强类型语言不同的是,javascript逻辑与前后的操作数可以应用于任何类型. 而且 ...
- windows下rabbitmq(架构师必备神器)集群搭建
准备2台机器,例如:computera: 10.0.0.151 computerb:10.0.0.234 都安装erlang环境和rabbitmq服务,注意otp环境和rabbitmq服务必须版 ...