Portal --> cf113D

Solution

  额题意的话大概就是给一个无向图然后两个人给两个出发点,每个点每分钟有\(p[i]\)的概率停留,问这两个人在每个点相遇的概率是多少

  如果说我们知道最后在哪里相遇,处理起来会比较方便。注意到\(n\)比较小,所以考虑枚举最后相遇的房间,然后可以看成求两个人同时从最后相遇的房间出发,走到\(X\)和\(Y\)的概率,这样初始状态什么的比较好表示,就会好求很多了(跟。。hnoi2013游走有点像?)

  考虑\(dp\) ,假设我们现在枚举到终点是\(t\),\(f[i][j]\)表示第一个人在\(i\)这个点,第二个人在\(j\)这个点的概率是多少

  那么有初始状态:

    1.\(i==j==t\)的情况,\(f[i][j]=1\)

    2.\(i==j!=t\)的情况,\(f[i][j]=0\)

  考虑从第\(i\)个房间走向一个相邻房间的概率\(k[i]\),记第\(i\)个点的度数为\(du[i]\),那么有

\[k[i]=\frac{1-p[i]}{du[i]}
\]

  (有\(1-p[i]\)的概率离开这个房间,并且走向每个相邻房间的概率是一样的)

  所以我们可以得到转移:

\[\begin{aligned}
f[i][j]&=p[i]*p[j]*f[i][j]&(都停留)\\
&+k[i]*p[j]*\sum f[u][j]&(第一个人走一步)\\
&+k[j]*p[i]*\sum f[i][v]&(第二个人走一步)\\
&+k[i]*k[j]*\sum f[u][v]&(两个人都走一步)
\end{aligned}
\]

  其中\(u\)满足\(i\)和\(u\)在原图中有一条边直接相连,\(v\)满足\(v\)和\(j\)在原图中有一条边直接相连

  然后移下项,对于每一对\((i,j)\)我们都可以得到一条长得像这样的式子:

\[\sum a_{i,j}*f[i][j]=c
\]

  将\(f[i][j]\)看成未知数,就可以直接用高斯消元来做了

  注意,移项的时候,因为在初始化中\(f[i][i]\)的值已经定下来了,所以应该当成常数来看

  

  代码大概长这个样子

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define db double
using namespace std;
const int N=25;
int mp[N][N],du[N];
db p[N],a[N*N][N*N],k[N],f[N],num[N][N];
int n,m,X,Y,mx;
db ans[N];
void fillmatrix(int t);
db gauss(int n);
void solve(int t);
void Fill(int x,int y);
int Id(int x,int y){return num[x][y];} int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int x,y;
scanf("%d%d%d%d",&n,&m,&X,&Y);
for (int i=1;i<=m;++i){
scanf("%d%d",&x,&y);
mp[x][y]=mp[y][x]=1;
++du[x]; ++du[y];
}
if (X==Y){
for (int i=1;i<=n;++i)
if (i==X) printf("%.10lf\n",1.0);
else printf("%.10lf\n",0.0);
return 0;
}
for (int i=1;i<=n;++i) scanf("%lf",p+i);
for (int i=1;i<=n;++i) k[i]=(1.0-p[i])/(1.0*du[i]);
mx=0;
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
if (i!=j) num[i][j]=++mx;
for (int i=1;i<=n;++i)
solve(i);
for (int i=1;i<=n;++i)
printf("%.10lf ",ans[i]);
printf("\n");
} void solve(int t){
fillmatrix(t);
ans[t]=gauss(mx);
} void fillmatrix(int t){
int id;
memset(a,0,sizeof(a));
memset(f,0,sizeof(f));
f[t]=1;
for (int i=1;i<=n;++i){
for (int j=1;j<=n;++j){
if (i!=j) Fill(i,j);
}
}
} void Fill(int x,int y){
int id=Id(x,y);
a[id][id]=p[x]*p[y]-1.0;
for (int i=1;i<=n;++i){
if (mp[i][x]){
if (i!=y)
a[id][Id(i,y)]+=k[x]*p[y];
else
a[id][mx+1]-=k[x]*p[y]*f[y];
}
if (mp[i][y]){
if (i!=x)
a[id][Id(x,i)]+=k[y]*p[x];
else
a[id][mx+1]-=k[y]*p[x]*f[x];
}
for (int j=1;j<=n;++j){
if (mp[i][x]&&mp[j][y]){
if (i!=j)
a[id][Id(i,j)]+=k[x]*k[y];
else
a[id][mx+1]-=k[x]*k[y]*f[j];
}
}
}
} db gauss(int n){
int id;
db tmp;
for (int i=1;i<=n;++i){
id=i;
for (int j=i+1;j<=n;++j)
if (fabs(a[j][i])>fabs(a[id][i])) id=j;
if (id!=i)
for (int j=1;j<=n+1;++j) swap(a[i][j],a[id][j]);
for (int j=i+1;j<=n;++j){
tmp=a[j][i]/a[i][i];
for (int k=i;k<=n+1;++k)
a[j][k]-=tmp*a[i][k];
}
}
for (int i=n;i>=1;--i){
for (int j=n;j>i;--j)
a[i][n+1]-=a[i][j]*a[j][n+1];
a[i][n+1]/=a[i][i];
}
return a[Id(X,Y)][mx+1];
}

【CF113D】Museum的更多相关文章

  1. 【254】◀▶IEW-Unit19

    Unit 19 Technology Communication I.名词性从句在雅思写作中的运用 英语中哪些位置可以放名词? 1)主语 2)宾语 3)表语 4)同位语 名词的位置放一个句子=名词性从 ...

  2. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  3. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  4. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  5. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  6. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  7. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  8. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

  9. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

随机推荐

  1. Java泛型理解

    Java泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型.当需要使用某一种算法时,又无法具体算法的数据类型,或者想指定类型值的上限或下限,那么这时就需要Java泛型来大显身手 ...

  2. PHP手动环境搭建之WAMP

    第一步:安装apache程序 首先需要去Apache官网下载Apache2.4(http://httpd.apache.org/download.cgi),操作如下图所示: 下载完成后把它解压出来,然 ...

  3. Linux建立互信关系(ssh公钥登录)

    Linux有多种登录方式,比如telnet.ssh.支持ssh登录方式:口令登录和公钥登录 ssh登录方式:ssh [-l login_name] [-p port] [user@]hostname ...

  4. Windows单机配置Kafka环境

    首先确保机器已经安装好Zookeeper,Zookeeper安装参考 Windows单机配置Zookeeper环境 然后确保Zookeeper是正常启动状态 下载Kafka http://kafka. ...

  5. 2019CSUST集训队选拔赛题解(一)

    来自ppq的毒瘤线段树 Sneakers   Description 有一天喜欢买鞋的ppq和小伙伴来到了某一家球鞋店,球鞋店有n种球鞋,价格分别为ai,ppq在鞋店兜兜转转,发现鞋店老板会偶尔将某段 ...

  6. 【C#】人脸识别 视频数据转图片数据

    使用虹软人脸识别的开发过程中遇到了转换的问题 因为不会用C#直接打开摄像头,就只能用第三方dll.一开始用Aforge,后来发现有个问题,关闭摄像头老是陷入等待,所以抛弃了.前一阵子开始用封装了Ope ...

  7. python sys模块使用详情

    python常用模块目录 sys模块提供了一系列有关Python运行环境的变量和函数.1.sys.argv可以用sys.argv获取当前正在执行的命令行参数的参数列表(list).变量解释sys.ar ...

  8. rest_framework之版本控制

    简介 API版本控制可以用来在不同的客户端使用不同的行为.REST框架提供了大量不同的版本设计. 版本控制是由传入的客户端请求决定的,并且可能基于请求URL,或者基于请求头. 有许多有效的方法达到版本 ...

  9. react native基础与入门

    react native基础与入门 一.react native 的优点 1.跨平台(一才两用) 2.低投入高回报 (开发成本低.代码复用率高) 3.性能高:拥有独立的js渲染引擎,比传统的h5+ w ...

  10. RIGHT-BICEP测试第二次程序

    根据Right-BICEP单元测试的方法我对我写的第二次程序进行了测试: 测试一:测试能否控制使用乘除 测试二:测试是否能加括号 测试三:是否可以控制题目输出数量 测试四:能否控制输出方式,选择文件输 ...