【概率dp 高斯消元】bzoj3270: 博物馆
一类成环概率dp的操作模式
Description
Input
Output
Sample Input
1 2
0.5
0.5
Sample Output
HINT
对于100%的数据有 n <= 20,n-1 <= m <= n(n-1)/2
题目分析
记$f[i][j]$为两人分别在$i$和$j$的概率,$u,v$为分别与$i,j$相连的点,那么有$$f[i][j]= \begin{cases} \sum \frac{f[u][v]*(1-p[u])*(1-p[v]))}{deg[u]*deg[v]}& \text{(u!=i&&v!=j)}\\\sum \frac{f[u][v]*(1-p[u])*p[v])}{deg[u]*deg[v]}& \text{(u!=i&&v=j)}\\\sum \frac{f[u][v]*p[u]*(1-p[v]))}{deg[u]*deg[v]}& \text{(u=i&&v!=j)}\\\sum \frac{f[u][v]*(1-p[u]*(1-p[v]))}{deg[u]*deg[v]}& \text{(u=i&&v=j)}\end{cases}$$
由于这里dp的关系成环,不能够直接转移,所以要使用高斯消元。由此共有$n^2$个状态,即$n^2$个未知量。故用$id[i][j]$来表示$f[i][j]$,就可方便地把这些未知量的关系用矩阵表示出来。
需要注意的是,初始$f[S][T]$的概率为1,不过后面又会有经过它的概率,所以在计算时需要考虑其初始概率。这里算是一个概率dp的奇怪的地方:最终$f[S][T]>1$。
再者是处理的一个小技巧:添一条自边便于处理。
#include<bits/stdc++.h>
const int maxn = ; int n,m,tot,S,T,deg[maxn],id[maxn][maxn];
double out[maxn],p[maxn],ans[maxn],mp[maxn][maxn];
int G[maxn][maxn]; void Gauss(int n)
{
double bse;
for (int i=, r; i<=n; i++)
{
r = i;
for (int j=i+; j<=n; j++)
if (fabs(mp[j][i]) > fabs(mp[r][i])) r = j;
if (r!=i) std::swap(mp[i], mp[r]);
bse = mp[i][i];
for (int j=i; j<=n+; j++) mp[i][j] /= bse;
for (int j=i+; j<=n; j++)
{
bse = mp[j][i];
for (int k=i; k<=n+; k++)
mp[j][k] -= bse*mp[i][k];
}
}
ans[n] = mp[n][n+];
for (int i=n-; i; i--)
{
ans[i] = mp[i][n+];
for (int j=i+; j<=n; j++) ans[i] -= ans[j]*mp[i][j];
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&S,&T);
tot = n*n;
for (int i=,x,y; i<=m; i++)
{
scanf("%d%d",&x,&y), ++deg[x], ++deg[y];
G[x][++G[x][]] = y, G[y][++G[y][]] = x;
}
for (int i=; i<=n; i++)
{
scanf("%lf",&p[i]);
G[i][++G[i][]] = i;
out[i] = (1.0-p[i])/(1.0*deg[i]);
}
for (int i=, t=; i<=n; i++)
for (int j=; j<=n; j++)
id[i][j] = ++t;
mp[id[S][T]][tot+] = -;
for (int i=; i<=n; i++)
for (int j=; j<=n; j++)
{
--mp[id[i][j]][id[i][j]];
for (int l=; l<=G[i][]; l++)
for (int r=; r<=G[j][]; r++)
{
int u = G[i][l], v = G[j][r];
if (u==v) continue;
if (u==i&&v==j) mp[id[i][j]][id[i][j]] += p[i]*p[j];
if (u!=i&&v!=j) mp[id[i][j]][id[u][v]] += out[u]*out[v];
if (u==i&&v!=j) mp[id[i][j]][id[u][v]] += p[u]*out[v];
if (u!=i&&v==j) mp[id[i][j]][id[u][v]] += out[u]*p[v];
}
}
Gauss(tot);
for (int i=; i<=n; i++) printf("%.6lf ",ans[id[i][i]]);
return ;
}
看到有网上有些博客说,高斯消元这里$mp[id[i][j]][id[u][v]]$是指$id[i][j]$状态转移到$id[u][v]$状态的概率,这个说法其实是不对的。$id[i][j]$实际上不过是和常规高斯消元一样,代表处理第几条方程;至于$id[u][v]$则表示当前这条方程中的$f[u][v]$;所以$mp[id[i][j]][id[u][v]]$是指第$id[i][j]$条方程中,第$id[u][v]$个未知量的系数。
END
【概率dp 高斯消元】bzoj3270: 博物馆的更多相关文章
- 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)条由两 ...
- BZOJ 3270: 博物馆 [概率DP 高斯消元]
http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...
- 【BZOJ3640】JC的小苹果 概率DP+高斯消元
[BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ...
- BZOJ 3270 博物馆 ——概率DP 高斯消元
用$F(i,j)$表示A在i,B在j的概率. 然后很容易列出转移方程. 然后可以高斯消元了! 被一个问题困扰了很久,为什么起始点的概率要加上1. (因为其他博客上都是直接写成-1,雾) 考虑初始状态是 ...
- 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径
2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 682 Solved: 384[Submit][Stat ...
- BZOJ 3640: JC的小苹果 [概率DP 高斯消元 矩阵求逆]
3640: JC的小苹果 题意:求1到n点权和\(\le k\)的概率 sengxian orz的题解好详细啊 容易想到\(f[i][j]\)表示走到i点权为j的概率 按点权分层,可以DP 但是对于\ ...
随机推荐
- 【NOI2012】迷失游乐园
题目链接:迷失游乐园(BZOJ) 迷失游乐园(Luogu) 独立完成的题,写一发题解纪念一波~ 模拟完样例大概可以知道是道树形DP了. 观察数据范围,发现是基环树,至少会有一个环. 先从树的部分开始 ...
- JVM 内存分析
简述JVM垃圾回收机制 垃圾回收机制时Java提供的自动释放内存空间的机制. 垃圾回收机制时JVM自导的一个线程,用于回收没有被引用的对象. JVM有一个运行时的数据区来管理内存.其主要包括五大部分: ...
- linux 初始配置(centos)-网络和可视化界面
1. 执行命令查看ip:ip addr 2. 如果没有或取到,要查看网卡是否启动,及ip配置是否正确,请先将ONBOOT改成yes,表示开机即启动 [lobin@localhost ~]$ cat / ...
- centos 创建 logrotate 进行日志分割
这里就不赘述logrotate了,具体是什么,有什么作用,自行百度. 我们先说下,如何进行nginx的日志切割: 比如:日志目录为:/usr/local/nginx/logs/access.log按照 ...
- 【VueJS】VueJS开发请求本地json数据的配置
VueJS开发请求本地json数据的配置,旧版本是build/dev-server.js,新版本是build/webpack.dev.conf.js. VueJS开发请求本地json数据的配置,早期的 ...
- 8.聚集函数 ---SQL
一.AVG()函数 A VG()通过对表中行数计数并计算其列值之和,求得该列的平均值.A VG()可用来返回所有列的平均值,也可以用来返回特定列或行的平均值. 警告:只用于单个列 AVG()只能用来确 ...
- 2017 ACM/ICPC Asia Regional Shenyang Online cable cable cable
Problem Description Connecting the display screen and signal sources which produce different color s ...
- Python 踩坑之旅进程篇其三pgid是个什么鬼 (子进程\子孙进程无法kill 退出的解法)
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4.1 技术关键字 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 Github: https: ...
- 小技巧:在向导式页面设计中使用hidden型输入可以避免session的使用
在向导式页面设计中使用hidden型输入可以避免session的使用,从而减小内存开支. 在表单中使用隐藏输入类型<input type="hidden" name=&quo ...
- If people in the communications only think about gains and losses of interest, then the pleasure of knowing each other will cease to exist.
If people in the communications only think about gains and losses of interest, then the pleasure of ...