BZOJ 3270 博物馆 ——概率DP 高斯消元
用$F(i,j)$表示A在i,B在j的概率。
然后很容易列出转移方程。
然后可以高斯消元了!
被一个问题困扰了很久,为什么起始点的概率要加上1。
(因为其他博客上都是直接写成-1,雾)
考虑初始状态是由什么转移过来的,发现可以由其他点走过来,也可以由初始定义转移。
而初始的定义就决定了它有一个1的概率。
加上之后就可以高斯消元了
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
double a[405][405],p[21];
int id[21][21],n,m,x,y,du[21],tot,st;
int h[405],to[405],ne[405],en=0; void add(int a,int b)
{
to[en]=b;ne[en]=h[a];h[a]=en++;
} void solve(int x,int y)
{
int num=id[x][y];
a[num][num]=1.0;
for (int i=h[x];i>=0;i=ne[i])
for (int j=h[y];j>=0;j=ne[j])
{
int tx=to[i],ty=to[j]; if (tx==ty) continue;
int tnum=id[tx][ty];
if (tx==x&&ty==y) a[num][tnum]-=p[tx]*p[ty];
else if (tx==x) a[num][tnum]-=p[tx]*(1-p[ty])/(du[ty]*1.0);
else if (ty==y) a[num][tnum]-=p[ty]*(1-p[tx])/(du[tx]*1.0);
else a[num][tnum]-=(1-p[tx])*(1-p[ty])/(du[tx]*1.0)/(du[ty]*1.0);
}
} void gauss()
{
F(i,1,tot)
{
int tmp=i;
while (!a[tmp][i]&&tmp<=tot) tmp++;
if (tmp>tot) continue;//自由元
F(j,i,tot+1) swap(a[i][j],a[tmp][j]);
F(j,1,tot) if (j!=i)
{
double t=a[j][i]/a[i][i];
F(k,1,tot+1)
a[j][k]-=t*a[i][k];
}
}
} int main()
{
memset(h,-1,sizeof h);
scanf("%d%d%d%d",&n,&m,&x,&y);
F(i,1,m)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
du[a]++;du[b]++;
}
F(i,1,n) add(i,i);
F(i,1,n) F(j,1,n) id[i][j]=++tot;
a[id[x][y]][tot+1]=1;
F(i,1,n) scanf("%lf",&p[i]);
F(i,1,n) F(j,1,n) solve(i,j);
gauss();
F(i,1,n)
{
int t=id[i][i];
printf("%.6f ",a[t][tot+1]/a[t][t]);
}
printf("\n");
}
我怎么还是不会写高斯消元?(⊙_⊙?)
方法二:
考虑初始向量S,转移矩阵A
那么答案就是$ans=SI+SA+SA^2...$
所以$ans=S(I-A)^{-1}$
然后就有$ans[I-A]^{T}=S$
高斯消元即可,或者求逆之后矩阵乘法
#include <map>
#include <ctime>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define maxn 405
double f[402][402],p[402],d[402][402];
double ans[402],S[402];
int ed,n,m,sa,sb,cnt;
int id[21][21],du[maxn],h[maxn],to[maxn],ne[maxn],en=0;
void add(int a,int b)
{to[en]=b;ne[en]=h[a];h[a]=en++;} void Build()
{
ed=cnt;
F(i,1,n) F(j,1,n)
if (i!=j) F(k,1,n) F(l,1,n)
f[id[i][j]][id[k][l]]-=d[i][k]*d[j][l];
F(i,1,ed) F(j,1,i-1) swap(f[i][j],f[j][i]);
F(i,1,ed) f[i][i]+=1;
f[id[sa][sb]][ed+1]=1;
} void Gauss()
{
F(i,1,ed)
{
int tmp=i;
F(j,i+1,ed) if (f[j][i]>f[tmp][i]) tmp=j;
if (tmp!=i) F(j,i,ed+1) swap(f[tmp][j],f[i][j]);
F(j,i+1,ed)
{
double t=f[j][i]/f[i][i];
F(k,i,ed+1) f[j][k]-=t*f[i][k];
}
}
D(i,ed,1)
{
F(j,i+1,ed) f[i][ed+1]-=f[i][j]*ans[j],f[i][j]=0;
ans[i]=f[i][ed+1]/f[i][i];
}
} int main()
{
memset(h,-1,sizeof h);
scanf("%d%d%d%d",&n,&m,&sa,&sb);
F(i,1,m)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
du[a]++;du[b]++;
}
F(i,1,n) scanf("%lf",&p[i]);
F(i,1,n)
{
d[i][i]=p[i];
for (int j=h[i];j>=0;j=ne[j])
d[i][to[j]]+=(1-p[i])/du[i];
}
F(i,1,n) F(j,1,n) id[i][j]=++cnt;
Build();
Gauss();
F(i,1,n) printf("%.6f ",ans[id[i][i]]);
}
BZOJ 3270 博物馆 ——概率DP 高斯消元的更多相关文章
- BZOJ 3270: 博物馆 [概率DP 高斯消元]
http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...
- bzoj 3270: 博物馆【dp+高斯消元】
好像是高斯消元解互相推(?)的dp的例子 首先考虑dp,设f[i][j]为一人在i一人在j的概率,点i答案显然就是f[i][i]: 然后根据题意,得到转移是 \[ f[i][j]=f[i][j]*p_ ...
- 【BZOJ3270】博物馆 概率DP 高斯消元
链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...
- BZOJ3270 博物館 概率DP 高斯消元
BZOJ3270 博物館 概率DP 高斯消元 @(XSY)[概率DP, 高斯消元] Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博 ...
- BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元
BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...
- LightOJ - 1151概率dp+高斯消元
概率dp+高斯消元 https://vjudge.net/problem/LightOJ-1151 题意:刚开始在1,要走到100,每次走的距离1-6,超过100重来,有一些点可能有传送点,可以传送到 ...
- 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元
题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...
- 【BZOJ3640】JC的小苹果 概率DP+高斯消元
[BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ...
- 【概率dp 高斯消元】bzoj3270: 博物馆
一类成环概率dp的操作模式 Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n ...
随机推荐
- MySQL 导出一句话
听说是很老的东西了,学习的时候发现还是很好用的,故学习转载过来,留备学习. mysql 导出一句话 方法1:网上流行的方法 流程:(1)建表--->(2)插入数据--->(3)select ...
- 编写Robotium测试程序
6.编写Robotium测试程序 1)导包 //导入需要测试的工程 import com.example.android.notepad.NotesList; //robotium提供的测试用类 im ...
- watchguard 软件工程师内部招聘!
作为watchguard正式员工,现发布公司最近的招聘信息,待遇优厚,请符合条件的朋友和我联系并将简历发给我,我会尽早联系公司人力部门. 我的邮件:daibao91888@163.com 博客:htt ...
- jni ndk 入门
1. Linux环境模拟,下载sygwin 安装,选择devl 和shell -> install sygwin 中的配置ndk环境,进入安装目录c:/cygwin64 etc/profile文 ...
- 动态规划初步--最长上升子序列(LIS)
一.问题 有一个长为n的数列 a0,a1,a2...,an-1a.请求出这个序列中最长的上升子序列的长度和对应的子序列.上升子序列指的是对任意的i < j都满足ai < aj的子序列. 二 ...
- sql视图和表的区别
整理一下视图和表的区别 区别: 1.视图是已经编译好了的sql,表不是 2.视图没有实际的物理存储记录,表有 3.视图是逻辑概念,表可以进行修改 5.表是内模式,视图是外模式 6.视图是我们查看表的方 ...
- PHP框架深度解析
PHP成为世界上最流行的脚本语言有许多原因:灵活性,易用性等等.但通常只用PHP或者其他语言编码就会显得单调.重复,这时候就需要一个PHP框架来代替程序员完成那些重复不变的部分.本文通过回答What, ...
- 量化投资,你需要了解的A股财务数据
摘要:基本面量化是应用量化研究领域的重头戏,财务数据的整理和加工是基本面量化的第一步.本文梳理了财务数据的基本知识,包括报表类型.数据来源.调整更正和使用原则等,并给出了单季度和TTM数据的计算流程. ...
- 带图形桌面的CentOS7----中安装VMWareTools以及支持中文输入
主机是WIN10操作系统 安装VMWareTools的方法:https://jingyan.baidu.com/article/e8cdb32b136ad637052bad26.html 在图形化Ce ...
- 利用Resttemplate进行put请求
开发中,最常用的是post.get这两种.今天我给大家展示一个利用put请求的demo,其实put请求跟post请求没啥区别,但是没有返回值. void put(String var1, @Nulla ...