Solution -「CF113D」Museum
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)\) 的状态都是不能用于转移的,因为它们已经是末状态了。
因为钦定了末状态只出现一次,故可知末状态的期望出现次数即该状态的概率。
故有
\]
显然这个转移是有后效性的,无法用简单的递推做。故考虑高斯消元,将该式转换为我们熟悉的方程形式进行求解即可。
共有 \(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的更多相关文章
- Solution -「构造」专练
记录全思路过程和正解分析.全思路过程很 navie,不过很下饭不是嘛.会持续更新的(应该). 「CF1521E」Nastia and a Beautiful Matrix Thought. 要把所有数 ...
- Solution -「原创」Destiny
题目背景 题目背景与题目描述无关.签到愉快. 「冷」 他半靠在床沿,一缕感伤在透亮的眼眸间荡漾. 冷见惆怅而四散逃去.经历嘈杂喧嚣,感官早已麻木.冷又见空洞而乘隙而入.从里向外,这不是感官的范畴. 他 ...
- Solution -「GLR-R2」教材运送
\(\mathcal{Description}\) Link. 给定一棵包含 \(n\) 个点,有点权和边权的树.设当前位置 \(s\)(初始时 \(s=1\)),每次在 \(n\) 个结点内 ...
- Solution -「WF2011」「BZOJ #3963」MachineWorks
\(\mathcal{Description}\) Link. 给定你初始拥有的钱数 \(C\) 以及 \(N\) 台机器的属性,第 \(i\) 台有属性 \((d_i,p_i,r_i,g_i ...
- Solution -「LOCAL」二进制的世界
\(\mathcal{Description}\) OurOJ. 给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{ ...
- Solution -「SHOI2016」「洛谷 P4336」黑暗前的幻想乡
\(\mathcal{Description}\) link. 有一个 \(n\) 个结点的无向图,给定 \(n-1\) 组边集,求从每组边集选出恰一条边最终构成树的方案树.对 \(10^9+ ...
- Solution -「LOCAL」大括号树
\(\mathcal{Description}\) OurTeam & OurOJ. 给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) ...
- Solution -「ZJOI2012」「洛谷 P2597」灾难
\(\mathcal{Description}\) link. 给定一个捕食网络,对于每个物种,求其灭绝后有多少消费者失去所有食物来源.(一些名词与生物学的定义相同 w.) 原图结点数 \ ...
- Solution -「JSOI2008」「洛谷 P4208」最小生成树计数
\(\mathcal{Description}\) link. 给定带权简单无向图,求其最小生成树个数. 顶点数 \(n\le10^2\),边数 \(m\le10^3\),相同边权的边数不 ...
随机推荐
- BGP路由协议详解(完整版)
(免责声明:来源于网络,版权原作者所有,转载仅为了传播.学习交流使用,如需删除请私信联系,严禁其他用途.) END 关注「开源Linux」加星标,提升IT技能 好文章,分享.点赞.在看三连哦️↓↓↓
- Apache Shiro 漏洞汇总
Apache Shiro 漏洞汇总 以下是我个人通过收集信息收集起来的一些Apache Shiro漏洞信息,这些漏洞的poc都是公开的,利用起来也是比较简单 Apache Shiro是什么东西: Ap ...
- django-rest-framework 基础二 序列化器和路由
django-rest-framework 基础二 序列化器和路由 目录 django-rest-framework 基础二 序列化器和路由 1. 序列化器 1.1 Serializer的使用 1.2 ...
- REST APIs
REST APIs 旨在通过HTTP 的动作语义METHOD, 以替代各种传统CRUD 操作所带来的命名问题,例如 "/userAdd"."/userDelete&quo ...
- PTA 7-4 堆栈操作合法性 (20 分)
假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列.请编写程序,输入S ...
- python 批量探测服务端开放的TCP端口
现在大多服务器都有做icmp限制或直接禁掉,导致我们业务去连接服务器异常时无法判断是程序问题还是网络问题,所以写一个简单探测tcp端口脚本来探测服务器所开放的端口,再使用tcp测试双向时延来排掉网络问 ...
- 戏说领域驱动设计(廿七)——Saga设计模型
上一节我们讲解了常用的事务,也提及了Saga,这是在分布式环境下被经常使用的一种处理复杂业务和分布式事务的设计模式.本章我们的主要目标是编写一个简单版本的Saga处理器,不同于Seata框架中那种可独 ...
- el-form 中的数组表单验证(数组可动态添加删除)
除了一些简单的表单验证之外,我们还会有一些稍微复杂点的多层级表单的验证,如下图所示可点击添加,删除对数组进行操作,当点击确定时需要验证每一条form-item不能为空 其tempalte部分主要代码如 ...
- goose消元
ps.改了标题 魔板 思路:按序消除变量,用当前行(i)[行i消\(x_i\)元素],消后面的每一行的i元素 最后按逆序回代值 注意若有i~n行i元素系数都为0说明没有唯一解(其余x的解跟i元素有关) ...
- SCSS 简要教程(常用指令与方法)
Sass是成熟.稳定.强大的CSS预处理器,而SCSS是Sass3版本当中引入的新语法特性,完全兼容CSS3的同时继承了Sass强大的动态功能. 特性概览 CSS书写代码规模较大的Web应用时,容易造 ...