好像是高斯消元解互相推(?)的dp的例子

首先考虑dp,设f[i][j]为一人在i一人在j的概率,点i答案显然就是f[i][i];

然后根据题意,得到转移是

\[f[i][j]=f[i][j]*p_i*p_j+\sum_{edge(x,i)\in E}f[x][j]*p_j*\frac{1-p[x]}{d[x]}+\sum_{edge(y,j)\in E}f[i][y]*p_i*\frac{1-p[y]}{d[y]}++\sum_{edge(x,i)\in E,edge(y,j)\in E}f[x][y]*\frac{1-p[x]}{d[x]}*\frac{1-p[y]}{d[y]}
\]

\[f[i][j]*(p_i*p_j-1)+\sum_{edge(x,i)\in E}f[x][j]*p_j*\frac{1-p[x]}{d[x]}+\sum_{edge(y,j)\in E}f[i][y]*p_i*\frac{1-p[y]}{d[y]}++\sum_{edge(x,i)\in E,edge(y,j)\in E}f[x][y]*\frac{1-p[x]}{d[x]}*\frac{1-p[y]}{d[y]}=0
\]

这样他就可以用高斯消元解了

注意,当f[i][j]中i==j时,就不能去转移其他情况了,因为这样已经是结束状态了

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=405;
int n,m,sx,sy,h[N],cnt,id[25][25],tot;
double p[N],a[N][N],d[N];
struct qwe
{
int ne,to;
}e[N<<1];
void add(int u,int v)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
h[u]=cnt;
}
void gaosi(int n)
{
for(int i=1;i<=n;i++)
{
int nw=i;
for(int j=i+1;j<=n;j++)
if(fabs(a[nw][i])<fabs(a[j][i]))
nw=j;
for(int j=i;j<=n+1;j++)
swap(a[nw][j],a[i][j]);
for(int j=i+1;j<=n+1;j++)
a[i][j]/=a[i][i];
a[i][i]=1;
for(int j=i+1;j<=n;j++)
{
for(int k=i+1;k<=n+1;k++)
a[j][k]-=a[j][i]*a[i][k];
a[j][i]=0;
}
}
for(int i=n-1;i>=1;i--)
for(int j=i+1;j<=n;j++)
a[i][n+1]-=a[j][n+1]*a[i][j];
}
int main()
{
scanf("%d%d%d%d",&n,&m,&sx,&sy);
for(int i=1,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
d[x]++,d[y]++;
add(x,y),add(y,x);
}
for(int i=1;i<=n;i++)
scanf("%lf",&p[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
id[i][j]=++tot;
for(int x=1;x<=n;x++)
for(int y=1;y<=n;y++)
{
a[id[x][y]][id[x][y]]--;
if(x!=y)
a[id[x][y]][id[x][y]]+=p[x]*p[y];
for(int i=h[x];i;i=e[i].ne)
for(int j=h[y];j;j=e[j].ne)
if(e[i].to!=e[j].to)
a[id[x][y]][id[e[i].to][e[j].to]]+=(1-p[e[i].to])*(1-p[e[j].to])/d[e[i].to]/d[e[j].to];
for(int i=h[x];i;i=e[i].ne)
if(e[i].to!=y)
a[id[x][y]][id[e[i].to][y]]+=p[y]*(1-p[e[i].to])/d[e[i].to];
for(int i=h[y];i;i=e[i].ne)
if(e[i].to!=x)
a[id[x][y]][id[x][e[i].to]]+=p[x]*(1-p[e[i].to])/d[e[i].to];
}
a[id[sx][sy]][n*n+1]--;
// for(int i=1;i<=n*n;i++)
// {
// for(int j=1;j<=n*n+1;j++)
// printf("%.6f ",a[i][j]);
// puts("");
// }
gaosi(n*n);
for(int i=1;i<=n;i++)
printf("%.6f ",a[id[i][i]][n*n+1]/a[id[i][i]][id[i][i]]);
return 0;
}

bzoj 3270: 博物馆【dp+高斯消元】的更多相关文章

  1. bzoj 3270 博物馆(高斯消元)

    [题意] 两人起始在s,t点,一人pi概率选择留在i点或等概率移动,问两人在每个房间相遇的概率. [思路] 把两个合并为一个状态,(a,b)表示两人所处的状态,设f[i]为两人处于i状态的概率.则有转 ...

  2. BZOJ 3270 && BZOJ 1778 (期望DP && 高斯消元)

    BZOJ 3270 :设置状态为Id(x,y)表示一人在x,一人在y这个状态的概率. 所以总共有n^2种状态. p[i]表示留在该点的概率,Out[i]=(1-p[i])/Degree[i]表示离开该 ...

  3. BZOJ 3270: 博物馆 [概率DP 高斯消元]

    http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...

  4. BZOJ3270 博物館 概率DP 高斯消元

    BZOJ3270 博物館 概率DP 高斯消元 @(XSY)[概率DP, 高斯消元] Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博 ...

  5. BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元

    BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...

  6. BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元

    BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...

  7. LightOJ - 1151概率dp+高斯消元

    概率dp+高斯消元 https://vjudge.net/problem/LightOJ-1151 题意:刚开始在1,要走到100,每次走的距离1-6,超过100重来,有一些点可能有传送点,可以传送到 ...

  8. 【BZOJ3640】JC的小苹果 概率DP+高斯消元

    [BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ...

  9. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

    题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...

随机推荐

  1. Mysql 数据库允许远程连接 服务器连接错误 Host 'XXX' is not allowed to connect to this MySQL server

    如果连接数据库的时候出现这个问题 Host 'XXX' is not allowed to connect to this MySQL server 说明 Mysql数据库 不允许远程连接, 需要修改 ...

  2. oracle 用户账户被锁处理

    一.以管理员身份登录 SQL> conn sys/sys as sysdba; (分号是必须的但是我是以system登录的所在这不应该写conn sys/sys as sysdba应该写conn ...

  3. Meteor事件

    使用事件是非常简单的.我们将学习如何使用tag,class 和id作为事件选择器. 让我们创建HTML模板三大要素.第一个是 p 标签,第二个是 myClass 类,最后一个是myId. meteor ...

  4. md5sum使用注意事项

    1. linux 命令行的 md5sum命令 echo -n "123456" | md5sum     //echo的时候, 默认是自带回车的, 必须要去掉 -n 去掉回车. 2 ...

  5. 磁盘显示为GPT(保护分区)

    问题描述:PE进入系统,在计算机管理里面磁盘显示为GPT(保护分区).此时硬盘是不能重新分区或者格式化的. 解决思路:低版本的WIndows(PE)是不支持GPT分区的,我们需要使用系统自带的Disk ...

  6. Android c/c++ 应用向linux 平台迁移执行

    鉴于近期在minicamera (linux + FPGA) 平台上模拟 安卓系统camera流程遭遇不断升级同步的困扰.尤其是 不开放源代码后 , 应用要链接封闭动态库造成的困难.以及在sprdis ...

  7. Zookeeper 3.4 官方文档翻译

    说明 个人英语水平非常一般,理解可能有偏差,假设有翻译不恰当之处,请看官指点. 1.简单介绍 分布式系统就像动物园.当中每台server就像一仅仅动物,Zookeeper就像动物园管理员,协调.服务于 ...

  8. asp.net mvc的权限管理设计

    现在集中展示用户-角色-权限管理的功能,因此,所有数据表一律简化处理.   1 后台管理效果 (1)角色管理 (2)权限管理   2 数据库设计(MSSQL) (1)用户表dbo.Users 项 类型 ...

  9. APache POI emaple ()

    Business Plan The BusinessPlan application creates a sample business plan with three phases, weekly ...

  10. C++11,控制台输出的一段小程序。

    #include <iostream> // std::cout, std::boolalpha, std::noboolalpha int main () { bool b = true ...