Upd 2021.10.21 更改了状态定义。

记 \(S(u)\) 表示 \(u\) 结点的相邻结点的集合。

又记 \(p(u)\) 表示走到了 \(u\) 且下一步继续留在 \(u\) 结点的概率,那么下一步离开 \(u\) 结点的概率即为 \(1 - p(u)\)。

设 \(f(i, j)\) 表示 Petya 在 \(i\) 且 Vasya 在 \(j\) 这种状态的期望出现次数。

可知所有的形如 \(f(i, i)\) 的状态都是不能用于转移的,因为它们已经是末状态了。

因为钦定了末状态只出现一次,故可知末状态的期望出现次数即该状态的概率。

故有

\[f(i, j) = \sum_{k \in S(i), k \neq j} f(k, j) \times \frac{1 - p(k)} {|S(k)|} \times p(j) + \sum_{k \in S(j), k \neq i} f(i, k) \times \frac{1 - p(k)} {|S(k)|} \times p(i) + \sum_{u \in S(i), v \in S(j), u \neq v} f(u, v) \times \frac{1 - p(u)} {|S(u)|} \times \frac{1 - p(v)} {|S(v)|}
\]

显然这个转移是有后效性的,无法用简单的递推做。故考虑高斯消元,将该式转换为我们熟悉的方程形式进行求解即可。

共有 \(n ^ 2\) 只方程,时间复杂度 \(O(n ^ 6)\)。

因为一开始处于初始状态,故初始状态期望出现次数自带 \(1\)。

#include <cstdio>
#include <vector>
using namespace std; int Abs(int x) { return x < 0 ? -x : x; }
int Max(int x, int y) { return x > y ? x : y; }
int Min(int x, int y) { return x < y ? x : y; } int read() {
int x = 0, k = 1;
char s = getchar();
while (s < '0' || s > '9') {
if (s == '-')
k = -1;
s = getchar();
}
while ('0' <= s && s <= '9') {
x = (x << 3) + (x << 1) + (s ^ 48);
s = getchar();
}
return x * k;
} void write(int x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9)
write(x / 10);
putchar(x % 10 + '0');
} void print(int x, char c) {
write(x);
putchar(c);
} const int MAXN = 23 * 23 + 5; struct Elimination {
bool free[MAXN];
int n, m, rk, opt;
double a[MAXN][MAXN], eps;
Elimination() { eps = 1e-15; }
Elimination(int N, int M) {
n = N;
m = M;
}
double Abs(double x) { return x < eps ? -x : x; }
void Swap(double &x, double &y) {
double t = x;
x = y;
y = t;
} void clear() {
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) a[i][j] = 0;
} void calc() {
int r = 1, c = 1;
for (; r <= n && c <= m; r++, c++) {
int pos = r;
for (int i = r + 1; i <= n; i++)
if (Abs(a[i][c]) > Abs(a[pos][c]))
pos = i;
if (Abs(a[pos][c]) < eps) {
r--;
continue;
}
if (pos != r)
for (int i = c; i <= m; i++) Swap(a[r][i], a[pos][i]);
double t;
for (int i = 1; i <= n; i++)
if (i != r && Abs(a[i][c]) > eps) {
t = a[i][c] / a[r][c];
for (int j = m; j >= c; j--) a[i][j] -= t * a[r][j];
}
}
rk = r;
}
}; int deg[MAXN];
double p[MAXN];
vector<int> mp[MAXN]; void Add_Edge(int u, int v) {
mp[u].push_back(v);
mp[v].push_back(u);
} struct node {
int x, y;
node() {}
node(int X, int Y) {
x = X;
y = Y;
}
int Get(int n) { return (x - 1) * n + y; }
}; int main() {
int n = read(), m = read(), x = read(), y = read();
for (int i = 1, u, v; i <= m; i++) {
u = read(), v = read();
Add_Edge(u, v);
deg[u]++, deg[v]++;
}
for (int i = 1; i <= n; i++) scanf("%lf", &p[i]);
Elimination q;
q.n = n * n;
q.m = q.n + 1;
q.clear();
q.a[node(x, y).Get(n)][q.m] = -1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
int pos = node(i, j).Get(n);
q.a[pos][pos]--;
if (i != j)
q.a[pos][pos] += p[i] * p[j];
for (size_t k1 = 0; k1 < mp[i].size(); k1++)
for (size_t k2 = 0; k2 < mp[j].size(); k2++) {
int u = mp[i][k1], v = mp[j][k2];
if (u == v)
continue;
q.a[pos][node(u, v).Get(n)] += (1 - p[u]) * (1 - p[v]) / deg[u] / deg[v];
}
for (size_t k = 0; k < mp[i].size(); k++)
if (mp[i][k] != j)
q.a[pos][node(mp[i][k], j).Get(n)] += (1 - p[mp[i][k]]) / deg[mp[i][k]] * p[j];
for (size_t k = 0; k < mp[j].size(); k++)
if (mp[j][k] != i)
q.a[pos][node(i, mp[j][k]).Get(n)] += (1 - p[mp[j][k]]) / deg[mp[j][k]] * p[i];
}
q.calc();
for (int i = 1; i <= n; i++)
printf("%.9f\n", q.a[node(i, i).Get(n)][q.m] / q.a[node(i, i).Get(n)][node(i, i).Get(n)]);
return 0;
}

Solution -「CF113D」Museum的更多相关文章

  1. Solution -「构造」专练

    记录全思路过程和正解分析.全思路过程很 navie,不过很下饭不是嘛.会持续更新的(应该). 「CF1521E」Nastia and a Beautiful Matrix Thought. 要把所有数 ...

  2. Solution -「原创」Destiny

    题目背景 题目背景与题目描述无关.签到愉快. 「冷」 他半靠在床沿,一缕感伤在透亮的眼眸间荡漾. 冷见惆怅而四散逃去.经历嘈杂喧嚣,感官早已麻木.冷又见空洞而乘隙而入.从里向外,这不是感官的范畴. 他 ...

  3. Solution -「GLR-R2」教材运送

    \(\mathcal{Description}\)   Link.   给定一棵包含 \(n\) 个点,有点权和边权的树.设当前位置 \(s\)(初始时 \(s=1\)),每次在 \(n\) 个结点内 ...

  4. Solution -「WF2011」「BZOJ #3963」MachineWorks

    \(\mathcal{Description}\)   Link.   给定你初始拥有的钱数 \(C\) 以及 \(N\) 台机器的属性,第 \(i\) 台有属性 \((d_i,p_i,r_i,g_i ...

  5. Solution -「LOCAL」二进制的世界

    \(\mathcal{Description}\)   OurOJ.   给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{ ...

  6. Solution -「SHOI2016」「洛谷 P4336」黑暗前的幻想乡

    \(\mathcal{Description}\)   link.   有一个 \(n\) 个结点的无向图,给定 \(n-1\) 组边集,求从每组边集选出恰一条边最终构成树的方案树.对 \(10^9+ ...

  7. Solution -「LOCAL」大括号树

    \(\mathcal{Description}\)   OurTeam & OurOJ.   给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) ...

  8. Solution -「ZJOI2012」「洛谷 P2597」灾难

    \(\mathcal{Description}\)   link.   给定一个捕食网络,对于每个物种,求其灭绝后有多少消费者失去所有食物来源.(一些名词与生物学的定义相同 w.)   原图结点数 \ ...

  9. Solution -「JSOI2008」「洛谷 P4208」最小生成树计数

    \(\mathcal{Description}\)   link.   给定带权简单无向图,求其最小生成树个数.   顶点数 \(n\le10^2\),边数 \(m\le10^3\),相同边权的边数不 ...

随机推荐

  1. CentOS 8 重启不能DHCP获取IP的解决方法

    一个执着于技术的公众号 今天遇到一个神奇的现象,我对CentOS 8系统做初始化之后再重启系统,发现系统不能通过NetworkManager获取DHCP IP了 查了系统日志发现是: Apr 30 0 ...

  2. Java-GUI 编程之 JList、JComboBox实现列表框

    目录 JList.JComboBox实现列表框 简单列表框 不强制存储列表项的ListModel和ComboBoxModel 强制存储列表项的DefaultListModel和DefaultCombo ...

  3. SpringBoot从0到0.7——第四天

    SpringBoot从0到0.7--第四天 今天进行实战开发一个小项目,SpringBoot和Thymeleaf集成的小项目 因为懒得写写前端,直接找的别人的项目在它的的基础上进行配置,进行修改.gi ...

  4. 数据管理技术发展,数据库应用发展史,数据库分类,MySQL

    计算机数据管理技术发展 1. 自由管理阶段 用户以文件形式将数据组织起来,并附属在各自的应用程序下.    1.数据不保存     当时计算机主要用于科学计算,一般不需要将数据长期保存,只是计算某一课 ...

  5. Centos 7以上安装Docker (亲测有效)

    一.安装前的准备 我的环境是VMware15虚拟机安装的Centos7,Linux内核是3.10.0-1062.4.1.e17.x86_64 1. 用root账户登录查看操作系统内核版本及相关信息 [ ...

  6. TS 自学笔记(一)

    TS 自学笔记(一) 本文写于 2020 年 5 月 6 日 日常废话两句 有几天没有更新了,最近学的比较乱,休息了两天感觉好一些了.这两天玩了几个设计软件,过几天也写篇文章分享分享. 为啥要学 TS ...

  7. JS 的 new 是个啥?

    JS 的 new 是个啥? 本文写于 2019 年 11 月 25 日 new关键字在很多语言里面,总是用于把类实例化,可是 JS 之前就没有"类"这个概念呀. 那 JS 的new ...

  8. JavaScript中if语句优化和部分语法糖小技巧推荐

    前言 在前端日常开发过程中,if else判断语句使用的次数应该是比较频繁的了,一些较为复杂的场景,可能会用到很多判断,在某个代码块使用很多if else时,代码会显得较为冗余,阅读起来不够清晰. 除 ...

  9. python常用标准库(math数学模块和random随机模块)

    常用的标准库 数学模块 import math ceil -- 上取整 对一个数向上取整(进一法),取相邻最近的两个整数的最大值. import math res = math.ceil(4.1) p ...

  10. [漏洞复现] [Vulhub靶机] Tomcat7+ 弱口令 && 后台getshell漏洞

    免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责. 0x00 背景知识 war文件 0x01 漏洞介绍 影响范围:Tomcat 8.0版本 漏洞类型:弱口令 漏洞成因:在tomc ...