【期望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 ...
随机推荐
- Jquery checkbox 遍历
checkbox 全选\全部取消 $("#ChkAll").click(function(){ $("#divContent input[type='checkbo ...
- hdu 1599 find the mincost route (最小环与floyd算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1599 find the mincost route Time Limit: 1000/2000 MS ...
- pcap的安装
pcap,即 packet capture library 抓包库,这个抓包库给抓包系统提供了一个高层次的接口.所有网络上的数据包,甚至是那些发送给其他主机的,通过这种机制,都是可以捕获的.它也支持把 ...
- python—RE正则表达式
re正则表达式 正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C 编写的 ...
- Vuex 基本概念
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 每一个 Vuex 应用的核心就是 stor ...
- 比 file_get_contents() 更优的 cURL 详解(附实例)
PHP 可以使用 file_get_content() 函数抓取网页内容,但却无法进行更复杂的处理,譬如文件的上传或下载. Cookie 操作等等.而 cURL 提供了这些功能. 一.cURL简介 在 ...
- qgis 插件开发
qgis 插件开发 http://blog.csdn.net/v6543210/article/details/40480341
- 【bzoj4459】JSOI2013丢番图
某JSOI夏令营出题人啊,naive! 你还是得学习个,搬这种原题不得被我一眼看穿? 求个n^2的约数除以二,向上取整. #include<bits/stdc++.h> using nam ...
- 【bzoj1649】Cow Roller Coaster
傻逼dp题. dp[i][j]表示用了i长度已花费成本j所能得到的价值. 然后枚举一下铁轨随便做了. 不行就sort一下. #include<bits/stdc++.h> #define ...
- Cent os FTP配置
原文:http://www.aicoffees.com/itshare/412261137.html