BZOJ_3270_博物馆_(高斯消元+期望动态规划+矩阵)
描述
http://www.lydsy.com/JudgeOnline/problem.php?id=3270
\(n\)个房间,刚开始两个人分别在\(a,b\),每分钟在第\(i\)个房间有\(p[i]\)的概率不动,如果动的话,等概率移动到连接的房间,求他们在每个房间相遇的概率.
分析
有点像BZOJ_1778_[Usaco2010_Hol]_Dotp_驱逐猪猡_(期望动态规划+高斯消元+矩阵)那道题.
在那道题里,转移的是炸弹,这道题里,转移的是两个人的状态.
我们把一个甲在\(i\),乙在\(j\)的状态看作是状态\((i-1)n+j\),共\(n种状态\),所以就有\(n^2\)种状态转移.
构造一个\(n^2\times{n^2}\)的矩阵\(f\),\(f[i][j]\)表示从\(i\)状态转移到\(j\)状态的概率.(注意f[i][i]不会再转移)
\(f^n[i][j]\)表示的就是走\(n\)次\(i\to{j}\)的概率.
构造一个行向量\(S={(a-1)n+b=1}\).
这样\(S\times{f^i}\)表示的就是走\(i\)次\((a-1)n+b\to{j}\)的概率.
那么答案行向量$$ans=\sum_{i=0}^{\infty}S\times{f^i}$$
根据等比数列求和公式
$$ans(I-f)=S$$
然后高斯消元,在\(ans\)里面找\((i,i)\)的状态即可.
#include <bits/stdc++.h>
using namespace std; const int maxn=+,maxm=+;
struct edge{
int to,next;
edge(){}
edge(int to,int next):to(to),next(next){}
}g[maxm];
int n,m,a,b,cnt;
int head[maxn],d[maxn];
double p[maxn],f[maxm][maxm];
inline int P(int x,int y){ return (x-)*n+y; }
void add_edge(int u,int v){
g[++cnt]=edge(v,head[u]); head[u]=cnt;
g[++cnt]=edge(u,head[v]); head[v]=cnt;
}
void gause(int n){
for(int i=;i<=n;i++){
int t=i;
for(int j=i+;j<=n;j++)if(fabs(f[j][i])>fabs(f[t][i])) t=j;
if(t!=i)for(int j=i;j<=n+;j++) swap(f[t][j],f[i][j]);
for(int j=i+;j<=n;j++){
double x=f[j][i]/f[i][i];
for(int k=i;k<=n+;k++) f[j][k]-=f[i][k]*x;
}
}
for(int i=n;i;i--){
for(int j=i+;j<=n;j++) f[i][n+]-=f[i][j]*f[j][n+];
f[i][n+]/=f[i][i];
}
}
int main(){
scanf("%d%d%d%d",&n,&m,&a,&b);
for(int i=;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
d[x]++; d[y]++;
add_edge(x,y);
}
for(int i=;i<=n;i++) scanf("%lf",&p[i]);
for(int x=;x<=n;x++)for(int y=;y<=n;y++){
if(x!=y){
f[P(x,y)][P(x,y)]-=p[x]*p[y];
for(int i=head[x];i;i=g[i].next) f[P(x,y)][P(g[i].to,y)]-=(-p[x])/d[x]*p[y];
for(int i=head[y];i;i=g[i].next) f[P(x,y)][P(x,g[i].to)]-=(-p[y])/d[y]*p[x];
for(int i=head[x];i;i=g[i].next)for(int j=head[y];j;j=g[j].next)
f[P(x,y)][P(g[i].to,g[j].to)]-=(-p[x])/d[x]*(-p[y])/d[y];
}
}
for(int i=;i<=n*n;i++)for(int j=;j<i;j++) swap(f[i][j],f[j][i]);
for(int i=;i<=n*n;i++) f[i][i]+=1.0;
f[P(a,b)][n*n+]=;
gause(n*n);
for(int i=;i<=n;i++) printf("%.6lf ",f[P(i,i)][n*n+]);
return ;
}
3270: 博物馆
Time Limit: 30 Sec Memory Limit: 128 MB
Submit: 237 Solved: 130
[Submit][Status][Discuss]
Description
的概率在这分钟内不去其他地方(即呆在房间不动),有1-Pi
的概率他会在相邻的房间中等可能的选择一间并沿着走廊过去。这里的i指的是当期所在房间的序号。在古代建造是一件花费非常大的事,因此每条走廊会连接两个
不同的房间,并且任意两个房间至多被一条走廊连接。
相遇)两个男孩按照上述方法行动直到他们碰面为止。更进一步地说,当两个人在某个时刻选择前往同一间房间,那么他们就会在那个房间相遇。
Input
Output
Sample Input
1 2
0.5
0.5
Sample Output
HINT
对于100%的数据有 n <= 20,n-1 <= m <= n(n-1)/2
Source
BZOJ_3270_博物馆_(高斯消元+期望动态规划+矩阵)的更多相关文章
- Codeforces 446D - DZY Loves Games(高斯消元+期望 DP+矩阵快速幂)
Codeforces 题目传送门 & 洛谷题目传送门 神仙题,%%% 首先考虑所有格子都是陷阱格的情况,那显然就是一个矩阵快速幂,具体来说,设 \(f_{i,j}\) 表示走了 \(i\) 步 ...
- BZOJ_1923_[Sdoi2010]外星千足虫_高斯消元+bitset
BZOJ_1923_[Sdoi2010]外星千足虫_高斯消元 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结 ...
- BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元
BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元 题意: 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本身,及他上下左右的4个元素(如果 ...
- HDU2262;Where is the canteen(高斯消元+期望)
传送门 题意 给出一张图,LL从一个点等概率走到上下左右位置,询问LL从宿舍走到餐厅的步数期望 分析 该题是一道高斯消元+期望的题目 难点在于构造矩阵,我们发现以下结论 设某点走到餐厅的期望为Ek 1 ...
- 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】
刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...
- HDU4870_Rating_双号从零单排_高斯消元求期望
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4870 原题: Rating Time Limit: 10000/5000 MS (Java/Other ...
- BZOJ3270 博物馆(高斯消元+概率期望)
将两个人各自所在点视为状态,新建一个图.到达某个终点的概率等于其期望次数.那么高斯消元即可. #include<iostream> #include<cstdio> #incl ...
- BZOJ 3143 HNOI2013 游走 高斯消元 期望
这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...
- 洛谷P3232 [HNOI2013]游走(高斯消元+期望)
传送门 所以说我讨厌数学……期望不会高斯消元也不会……好不容易抄好了高斯消元板子被精度卡成琪露诺了…… 首先,我们先算出走每一条边的期望次数,那么为了最小化期望,就让大的期望次数乘上小编号 边的期望次 ...
随机推荐
- Python爬虫第一集
import urllib2 response = urllib2.urlopen("http://www.baidu.com") print response.read() 简单 ...
- java中的IO流
Java中的IO流 在之前的时候我已经接触过C#中的IO流,也就是说集中数据固化的方式之一,那么我们今天来说一下java中的IO流. 首先,我们学习IO流就是要对文件或目录进行一系列的操作,那么怎样操 ...
- windows10和ubuntu16.04双系统下时间不对的问题
最近装了windows10和ubuntu16.04双系统,仍然出现了喜闻乐见的老问题,装完后,在windows下时区不对,之前的老办法是: sudo gedit /etc/default/rcS ut ...
- Linux---文件类型及权限操作
文件类型: 用ls命令查看目录下所属文件时,每行的第一个字母标识着文件对应的文件类型 '-':代表普通文件 'd':代表目录 'c':字符设备文件 'b':块设备文件 's':套接字文件 'l':符号 ...
- c#拖放
AllowDrop DragEnter: if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Cop ...
- 会话控制:cookie和session基础学习笔记
在多次HTTP连接间维护用户与同一用户发出的不同请求之间关联的情况称为维护一个会话(session) 我们可以简单理解为浏览器的开关. 其实对cookie和session也是主要为curd操作 coo ...
- SVN菜单说明
01.SVN Checkout(SVN取出) 点击SVN Checkout,弹出检出提示框,在URL of repository输入框中输入服务器仓库地址,在Checkout directory输入框 ...
- Compass 使用手册
在EDM中使用基准 定义和基准相关的术语 这一段定义了基准术语.可以在属性对话框中知道 项目属性 系统基准 系统基准在项目属性里设置,并且值为0.它 ...
- Linux下配置jdk1.7
第一步:下载jdk-7-linux-i586.tar.gz wget -c http://download.oracle.com/otn-pub/java/jdk/7/jdk-7-linux-i586 ...
- 精确到秒的JQuery日期控件
项目中需要用到精确到秒的日期控件,到网上搜了一下,发现有一个JQuery控件可以实现该功能---TimerPicker.但是官网上没有提供该控件的完整Demo,而且没有提供汉化包,所以自己汉化了一下, ...