题面

传送门

思路

本题的点数很少,只有20个

考虑用二元组$S=(u,v)$表示甲在$u$点,乙在$v$点的状态

那么可以用$f(S)$表示状态$S$出现的概率

不同的$f$之间的转移就是通过边

转移有4种情况

对于$S=(u,v)$来说,有以下四种转移:

转移一,甲乙都选择不动,此时从$S$转移到$S$,概率为$p[u]*p[v]$

转移二,甲动乙不动,此时从$S$转移到$S'=(u',v)$,其中$u'$是异于$u$并与$u$相连的点,概率为$\frac{1-p[u]}{deg[u]}*p[v]$,其中$deg[i]$表示$i$的度数

转移三,甲不动乙动,同转移二

转移四,甲乙都动,此时从$S$转移到$S'=(u',v')$,概率为$\frac{1-p[u]}{deg[u]}\ast\frac{1-p[v]}{deg[v]}$

写完转移,发现这个图因为是联通的,所以状态之间的转移会连成一个环

这时需要用到高斯消元

构建nn个nn元方程,每个未知数对应一种状态$S$,那么每一项的系数就是上述的转移概率了

需要注意的有两点

第一,$S=(u,u)$转移到自己是没有概率的,因为这个状态已经停下了,不会再转移了

第二,出发节点的那个方程表达式的值是1,代表一个初始元位置在出发点这里

Code

```cpp

include

include

include

include

include

include

define id(i,j) (i-1)*n+j

define ll long long

using namespace std;
inline int read(){
int re=0,flag=1;char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
return reflag;
}
double a[510][510],p[110],deg[110],go[110],ans[510];
int n,m,op1,op2,cnt;
int first[110],cnte;
struct edge{
int to,next;
}e[1010];
inline void add(int u,int v){
deg[u]++;deg[v]++;
e[++cnte]=(edge){v,first[u]};first[u]=cnte;
e[++cnte]=(edge){u,first[v]};first[v]=cnte;
}
void Gauss(){
int i,j,k,num;double tmp;
for(i=1;i<=cnt;i++){
num=i;
for(j=i+1;j<=cnt;j++){
if(fabs(a[num][i])<fabs(a[j][i])) num=j;
}
if(num!=i) for(j=1;j<=cnt+1;j++) swap(a[i][j],a[num][j]);
for(j=i+1;j<=cnt;j++){
if(i!=j&&a[j][i]){
tmp=a[j][i]/a[i][i];
for(k=1;k<=cnt+1;k++) a[j][k]-=a[i][k]
tmp;
}
}
}
for(i=cnt;i>=1;i--){
for(j=i+1;j<=cnt;j++) a[i][cnt+1]-=a[i][j]ans[j];
ans[i]=a[i][cnt+1]/a[i][i];
}
}
int main(){
memset(first,-1,sizeof(first));
n=read();m=read();op1=read();op2=read();int i,j,t1,t2,u1,u2,v1,v2,tid;cnt=n
n;
for(i=1;i<=m;i++){
t1=read();t2=read();
add(t1,t2);
}
for(i=1;i<=n;i++) scanf("%lf",&p[i]),go[i]=(1.0-p[i])/deg[i];
for(u1=1;u1<=n;u1++){
for(u2=1;u2<=n;u2++){
tid=id(u1,u2);
a[tid][tid]=-1;
if(u1!=u2) a[tid][tid]+=p[u1]p[u2];
for(i=first[u1];~i;i=e[i].next){
v1=e[i].to;if(v1==u2) continue;
a[tid][id(v1,u2)]=go[v1]
p[u2];
}
for(i=first[u2];~i;i=e[i].next){
v2=e[i].to;if(v2==u1) continue;
a[tid][id(u1,v2)]=p[u1]go[v2];
}
for(i=first[u1];~i;i=e[i].next){
for(j=first[u2];~j;j=e[j].next){
v1=e[i].to;v2=e[j].to;if(v2==v1) continue;
a[tid][id(v1,v2)]=go[v1]
go[v2];
}
}
}
}
a[id(op1,op2)][cnt+1]-=1;
Gauss();
for(i=1;i<=n;i++) printf("%.6lf ",ans[id(i,i)]);
}
···

[bzoj3270] 博物馆 [期望+高斯消元]的更多相关文章

  1. BZOJ3270 博物馆(高斯消元+概率期望)

    将两个人各自所在点视为状态,新建一个图.到达某个终点的概率等于其期望次数.那么高斯消元即可. #include<iostream> #include<cstdio> #incl ...

  2. 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元

    [题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...

  3. 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元

    [题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ...

  4. [BZOJ3143][HNOI2013]游走(期望+高斯消元)

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3576  Solved: 1608[Submit][Status ...

  5. 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】

    刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...

  6. bzoj3270 博物馆(期望+高斯消元)

    Time Limit: 30 Sec  Memory Limit: 128 MB 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的 ...

  7. BZOJ_3270_博物馆_(高斯消元+期望动态规划+矩阵)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3270 \(n\)个房间,刚开始两个人分别在\(a,b\),每分钟在第\(i\)个房间有\(p[ ...

  8. 【BZOJ3270】【高斯消元】博物馆

    Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n间房间,并且满足可以从任何一 ...

  9. BZOJ 3270: 博物馆 概率与期望+高斯消元

    和游走挺像的,都是将概率转成期望出现的次数,然后拿高斯消元来解. #include <bits/stdc++.h> #define N 23 #define setIO(s) freope ...

随机推荐

  1. Linux平台下卸载MySQL的方法

    转载自: https://www.cnblogs.com/taomylife/p/7234925.html Linux平台下卸载MySQL的方法: MySQL的安装主要有三种方式:二进制包安装.RPM ...

  2. springMVC-基本认识

    MVC设计模式 Controller Model View SpringMVC 1.  实现MVC设计模式的框架 2.  基于springIOC,是spring的一个子模块,不需要整合 核心组件 1. ...

  3. Linux实战教学笔记16:磁盘原理

    第十五节 磁盘原理 标签(空格分隔): Linux实战教学笔记 1,知识扩展 非脚本方式的一条命令搞定批量创建用户并设置随机10位字母数字组合密码. 1.1 sed的高级用法 [root@chensi ...

  4. Docker虚拟化容器的使用

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Li ...

  5. keil5的安装及问题

    win8+keil 注意,在进行破解的时候首先要打开一个工程,而且keil要用管理员的身份进行运行, 才可以破解完成 发现打开之后,出现这样的错误. 原因是因为在创建工程的时候在下图中点了是,要点否才 ...

  6. JRE和JDK区别

    JRE: Java Runtime Environment JDK:Java Development Kit JRE顾名思义是java运行时环境, 包含了java虚拟机,java基础类库. 是使用ja ...

  7. C语言字符篇(一)字符串转换函数

      #include <stdlib.h>   double atof(const char *nptr);  将字符串转换成双精度浮点数 int atoi(const char *npt ...

  8. C语言数组篇(二)指针数组和数组指针

    数组指针 和 指针数组         这两个名词可以说是经常搞混了         数组指针--> 数组的指针       就是前面讲的 指向数组a的指针p;         指针数组--&g ...

  9. 牛客暑假多校第二场J-farm

    一.题意 White Rabbit has a rectangular farmland of n*m. In each of the grid there is a kind of plant. T ...

  10. C# 中的正则简单例子

    public static void Main() { Regex rgx = new Regex(@"[S|s]et-[C|c]ookie: (?<cookieName>\w+ ...