3270: 博物馆

Time Limit: 30 Sec  Memory Limit: 128 MB
Submit: 269  Solved: 147
[Submit][Status][Discuss]

Description

有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆。这座博物馆有着特别的样式。它包含由m条走廊连接的n间房间,并且满足可以从任何一间房间到任何一间别的房间。
两个人在博物馆里逛了一会儿后两人决定分头行动,去看各自感兴趣的艺术品。他们约定在下午六点到一间房间会合。然而他们忘记了一件重要的事:他们并没有选好在哪儿碰面。等时间到六点,他们开始在博物馆里到处乱跑来找到对方(他们没法给对方打电话因为电话漫游费是很贵的)
不过,尽管他们到处乱跑,但他们还没有看完足够的艺术品,因此他们每个人采取如下的行动方法:每一分钟做决定往哪里走,有Pi 的概率在这分钟内不去其他地方(即呆在房间不动),有1-Pi 的概率他会在相邻的房间中等可能的选择一间并沿着走廊过去。这里的i指的是当期所在房间的序号。在古代建造是一件花费非常大的事,因此每条走廊会连接两个不同的房间,并且任意两个房间至多被一条走廊连接。
两个男孩同时行动。由于走廊很暗,两人不可能在走廊碰面,不过他们可以从走廊的两个方向通行。(此外,两个男孩可以同时地穿过同一条走廊却不会相遇)两个男孩按照上述方法行动直到他们碰面为止。更进一步地说,当两个人在某个时刻选择前往同一间房间,那么他们就会在那个房间相遇。
两个男孩现在分别处在a,b两个房间,求两人在每间房间相遇的概率。

Input

第一行包含四个整数,n表示房间的个数;m表示走廊的数目;a,b (1 ≤ a, b ≤ n),表示两个男孩的初始位置。
之后m行每行包含两个整数,表示走廊所连接的两个房间。
之后n行每行一个至多精确到小数点后四位的实数 表示待在每间房间的概率。
题目保证每个房间都可以由其他任何房间通过走廊走到。

Output

输出一行包含n个由空格分隔的数字,注意最后一个数字后也有空格,第i个数字代表两个人在第i间房间碰面的概率(输出保留6位小数)
注意最后一个数字后面也有一个空格

Sample Input

2 1 1 2
1 2
0.5
0.5

Sample Output

0.500000 0.500000

HINT

对于100%的数据有 n <= 20,n-1 <= m <= n(n-1)/2

Source

题解待更!

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#include<vector>
#define eps 1e-9
using namespace std;
int n,m,tot,aa,bb;
int d[];
double a[][],p[],f[];
vector<int> e[];
int id(int x,int y){return (x-)*n+y;
}
void build(int x,int y)
{
a[id(x,y)][id(x,y)]--;
for (unsigned int i=; i<e[x].size(); i++)
for (unsigned int j=; j<e[y].size(); j++)
{
int xx=e[x][i],yy=e[y][j];
if (xx!=yy)
{
if (xx==x && yy==y) a[id(x,y)][id(xx,yy)]+=1.0*p[x]*p[y];
else if (xx==x) a[id(x,y)][id(xx,yy)]+=1.0*p[xx]*(-p[yy])/d[yy];
else if (yy==y) a[id(x,y)][id(xx,yy)]+=1.0*(-p[xx])*p[yy]/d[xx];
else a[id(x,y)][id(xx,yy)]+=1.0*(-p[xx])*(-p[yy])/d[xx]/d[yy];
}
}
}
void gauss()
{
double t; int to;
for (int i=; i<=tot; i++)
{
t=,to=;
for (int j=i; j<=tot; j++) if (fabs(a[j][i])>t) t=fabs(a[j][i]),to=j;
if (to!=i) for (int j=; j<=tot+; j++) swap(a[to][j],a[i][j]);
for (int j=i+; j<=tot; j++)
{
if (fabs(a[j][i])<eps) continue;
t=a[j][i]/a[i][i];
for (int k=i; k<=tot+; k++) a[j][k]-=t*a[i][k];
}
}
for (int i=tot; i; i--)
{
t=1.0*a[i][tot+];
for (int j=i+; j<=tot; j++) t-=1.0*f[j]*a[i][j];
f[i]=1.0*t/a[i][i];
}
}
void init()
{
scanf("%d%d%d%d",&n,&m,&aa,&bb);
tot=n*n;
a[id(aa,bb)][tot+]=-;
for (int i=; i<=n; i++) e[i].push_back(i);
for (int i=; i<=m; i++)
{
int u,v; scanf("%d%d",&u,&v); d[u]++; d[v]++;
e[u].push_back(v); e[v].push_back(u);
}
for (int i=; i<=n; i++) scanf("%lf",&p[i]);
for (int i=; i<=n; i++) for (int j=; j<=n; j++) build(i,j);
}
int main()
{
init();
gauss();
for(int i=;i<=n;i++)
{
int t=id(i,i);
printf("%.6lf",f[t]);
if(i!=n)printf(" ");
}
return ;
}

BZOJ3270: 博物馆的更多相关文章

  1. BZOJ3270:博物馆(高斯消元)

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

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

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

  3. BZOJ3270: 博物馆【概率DP】【高斯消元】

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

  4. 【概率dp 高斯消元】bzoj3270: 博物馆

    一类成环概率dp的操作模式 Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n ...

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

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

  6. [bzoj3270] 博物馆 [期望+高斯消元]

    题面 传送门 思路 本题的点数很少,只有20个 考虑用二元组$S=(u,v)$表示甲在$u$点,乙在$v$点的状态 那么可以用$f(S)$表示状态$S$出现的概率 不同的$f$之间的转移就是通过边 转 ...

  7. bzoj3270博物馆——期望概率DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3270 设计一个状态表示两个人分别在两个点的状态,带个标号num[i][j]: 据此得到状态之 ...

  8. OI刷题录——hahalidaxin

    16-3-25  —— bzoj 2049 [Sdoi2008]Cave 洞穴勘测:LCT入门 bzoj 2002 [Hnoi2010]Bounce 弹飞绵羊:LCT Tsinsen A1303. t ...

  9. 【BZOJ3270】博物馆 期望DP+高斯消元

    [BZOJ3270]博物馆 Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n ...

随机推荐

  1. ecshop后台增加模块菜单项详细教程(图文)

    有的时候我们会在后台增加新的功能,菜单项是一个程序的入口,是必不可少的,如何在后台增加菜单项呢,大家可以参考下面的教程:   例如:想在后台左侧的菜单栏的"促销管理"下添加一个&q ...

  2. HDU 5215 BestCoder"杯中国大学生程序设计冠军赛” 边双连通分量取出子图+二分染色判图内奇偶环

    Cycle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Sub ...

  3. Android应用性能测试之CPU和内存占用

    最近发现自己学的很多东西没有做好积淀的工作,也萌生了写一些东西的念头.本人也没有写博客的习惯,下边就写一下手机端的性能测试. 最近公司,要我们从事对竞品的性能测试,我负责CPU和内存的性能测试,下面就 ...

  4. C# 中的内存管理,摘自网络

    C#编程的一个优点是程序员不需要关心具体的内存管理,尤其是垃圾收集器会处理所有的内存清理工作.虽然不必手工管理内存,但如果要编写高质量的代码,还是要理解后台发生的事情,理解C#的内存管理.本文主要介绍 ...

  5. 使用 Buildot 实现持续集成

    原文:http://www.ibm.com/developerworks/cn/linux/l-buildbot/ 持续集成(CI)是发扬以下原则的一个软件开发流程: 维护单源存储库 自动化构建过程 ...

  6. maven编码 gbk 的不可映射字符解决办法

    出现这个问题修改一下pom文件的编译配置就好了. <plugin> <groupId>org.apache.maven.plugins</groupId> < ...

  7. Fragment在Activity中的应用 (转载)

    原文链接 http://www.cnblogs.com/nanxin/archive/2013/01/24/2875341.html 在本小节中介绍在Activity中创建Fragment. 官网有很 ...

  8. Chapter 1 First Sight——6

    "You didn't need to do that, Dad. I was going to buy myself a car." 你不需要这样,父亲,我会自己买一辆车的 &q ...

  9. Android网络开发之Volley--Volley基本用法ImageRequest(三)

    1.ImageRequest用法和StringRequest一样,主要分为3步: (1).实例化一个RequestQueue对象 (2).设置ImageRequest对象参数,并将ImageReque ...

  10. 在Ubuntu 14.04 64bit上安装StarUML 2.5版本

    1,在“http://staruml.io/”下载: 2,sudo dpkg -i StarUML-v2.5.0-64-bit.deb安装. 3,注册 .在help中输入.name:maxiongyi ...