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


思路

因为n很小考虑状态\(t_{i,j}\)表示出现第一个人在i,第二个人在j的期望次数

因为边可以双向转移,所以转移是存在环的

考虑怎么表示一个dp转移

\(t_{id_{x, y},id_{x, y}} += (p_x * p_y)[x\not= y]\)

\(t_{id_{x, y},id_{u, y}} += (1-p_u)/d_u * p_y[u\not=y]\)

\(t_{id_{x, y},id_{x, v}} += p_x * (1-p_v)/d_v[x\not=v]\)

\(t_{id_{x, y},id_{u, v}} += (1-p_u)/d_u * (1-p_v)/d_v[u\not=v]\)

转移有环可以直接用高斯消元解决掉

注意一下:

  • 因为在每个点停止的状态只可能出现一次,所以出现的期望次数就是出现概率

  • 在写转移方程的时候默认左边有\(t_{id_{x, y},id_{x, y}}\),所以高消的时候需要把这个东西系数减一

  • 因为一开始有初始位置a和b,所以初值\(t[id_{a,b}][n*n+1]=-1\)

//Author: dream_maker
#include<bits/stdc++.h>
using namespace std;
//----------------------------------------------
//typename
typedef long long ll;
//convenient for
#define fu(a, b, c) for (int a = b; a <= c; ++a)
#define fd(a, b, c) for (int a = b; a >= c; --a)
#define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
//inf of different typename
const int INF_of_int = 1e9;
const ll INF_of_ll = 1e18;
//fast read and write
template <typename T>
void Read(T &x) {
bool w = 1;x = 0;
char c = getchar();
while (!isdigit(c) && c != '-') c = getchar();
if (c == '-') w = 0, c = getchar();
while (isdigit(c)) {
x = (x<<1) + (x<<3) + c -'0';
c = getchar();
}
if (!w) x = -x;
}
template <typename T>
void Write(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) Write(x / 10);
putchar(x % 10 + '0');
}
//----------------------------------------------
const int N = 410;
#define id(x,y) (n * (x - 1) + y)
int n, m, a, b, d[N];
vector<int> g[N];
double p[N], t[N][N];
void guass(int n) {
fu(i, 1, n) {
int j = 0;
fu(k, i, n) if (fabs(t[k][i]) > fabs(t[j][i])) j = k;
fu(k, 1, n + 1) swap(t[j][k], t[i][k]);
double w = t[i][i];
fu(k, 1, n + 1) t[i][k] /= w;
fu(k, 1, n) {
if (k == i) continue;
w = t[k][i];
fu(p, 1, n + 1) t[k][p] -= w * t[i][p];
}
}
}
int main() {
Read(n), Read(m); Read(a); Read(b);
fu(i, 1, m) {
int u, v; Read(u), Read(v);
g[u].push_back(v);
g[v].push_back(u);
++d[u], ++d[v];
}
fu(i, 1, n) scanf("%lf", &p[i]);
fu(i, 1, n * n)
fu(j, 1, n * n) t[i][j] = 0;
fu(x, 1, n) {
fu(y, 1, n) {
if (x != y) {
t[id(x, y)][id(x, y)] = p[x] * p[y] - 1.0;
} else {
t[id(x, y)][id(x, y)] = -1;
}
fv(u, g[x]) if (g[x][u] != y) t[id(x, y)][id(g[x][u], y)] = (1.0 - p[g[x][u]]) / (double) d[g[x][u]] * p[y];
fv(v, g[y]) if (x != g[y][v]) t[id(x, y)][id(x, g[y][v])] = p[x] * (1.0 - p[g[y][v]]) / (double) d[g[y][v]];
fv(u, g[x])
fv(v, g[y]) if(g[x][u] != g[y][v]) t[id(x, y)][id(g[x][u], g[y][v])] = (1.0 - p[g[x][u]]) / (double) d[g[x][u]] * (1.0 - p[g[y][v]]) / (double) d[g[y][v]];
}
}
t[id(a, b)][n * n + 1] = -1;
guass(n * n);
fu(i, 1, n) printf("%.6lf ", t[id(i, i)][n * n + 1]);
return 0;
}

BZOJ3270: 博物馆【概率DP】【高斯消元】的更多相关文章

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

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

  2. BZOJ 3270 博物馆 ——概率DP 高斯消元

    用$F(i,j)$表示A在i,B在j的概率. 然后很容易列出转移方程. 然后可以高斯消元了! 被一个问题困扰了很久,为什么起始点的概率要加上1. (因为其他博客上都是直接写成-1,雾) 考虑初始状态是 ...

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

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

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

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

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

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

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

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

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

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

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

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

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

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

  10. 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径

    2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 682  Solved: 384[Submit][Stat ...

随机推荐

  1. Check out our list of adidas NMD Singapore retailers

    The adidas NMD Singapore is confirmed to produce on The month of january 14th at select adidas Origi ...

  2. Singapore retailer will release this adidas NMD R1

    Select spots are restocking the adidas NMD Singapore this Friday, Feb 24th featuring three different ...

  3. 制造抽象基类--《C++必知必会》 条款33

    抽象类,含有纯虚函数的类,不可以创建对象. 然而,有时我们并不需要某个函数定义为纯虚函数,但是任然希望此类像抽象类一样,不可以创建对象. 方法1:通过确保类中不存在共有构造函数来模拟抽象基类的性质.意 ...

  4. Linux系统——Nginx基础

    Nginx是一个开源的,支持高性能.高并发(特别是静态资源)的www服务和代理服务软件,还具有反向代理复杂均衡功能和缓存服务功能,与lvs负载均衡及Haproxy等专业代理软件相比,nginx部署更简 ...

  5. uva11404

    这题说的是给了一个长度为n的字符串(1000)求最长回文子序列,并输出当str[i]==ste[j]时dp[i][j]=dp[i+1][i-1]+2 否则 dp[i][j]=Max(dp[j+1][i ...

  6. CentOS下安装JDK,Tomcat,Redis,Mysql,及项目发布

    上传文件到服务器,安装lrzsz , 可以将本地的文件上传到linux系统上. 如果是CentOS则可以用yum install lrzsz 命令安装,更方便. 或:yum -y install lr ...

  7. OpenCV图像的轮廓的匹配

    http://blog.sina.com.cn/s/blog_67a7426a0101cxl0.html 一个跟轮廓相关的最常用到的功能是匹配两个轮廓.如果有两个轮廓,如何比较它们;或者如何比较一个轮 ...

  8. bzoj1297 / P4159 [SCOI2009]迷路

    P4159 [SCOI2009]迷路 如果边权只有 0/1 那么不就是一个灰常简单的矩阵快速幂吗! 然鹅边权 $<=9$ 所以我们把每个点拆成9个点! 解决~ #include<iostr ...

  9. P1136 迎接仪式

    P1136 迎接仪式 $O(n^{2}k)$:$f[i][k]$表示到第$i$个字符为止,交换$k$次,得到的最多子串数 那么枚举位置$j$,状态可以从$f[j][k-1]+1$转移过来 $O(nk^ ...

  10. [BZOJ1176]Mokia

    Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000 ...