应该算高斯消元经典题了吧。

题意:一个无向连通图,有两个人分别在\(s,t\),若一个人在\(u\),每一分钟有\(p[u]\)的概率不动,否则随机前往一个相邻的结点,求在每个点相遇的概率

题解

首先求一个\(mov[i]=\frac{1-p[i]}{deg[i]}\)表示结点i每次移动到某个相邻结点的概率,\(deg[i]\)表示结点\(i\)的度

为了方便,我们把每个点向自己连条边,下面写式子好些(注意度数不能增加)

然后考虑设计状态\(f(a,b)\)表示第一个人在\(a\),第二个人在\(b\)的概率

\[f(a,b)=\sum_{(u,a),(v,b),u\not =v}g(u,a)g(v,b)
\]

其中\(g(a,b)\)表示\(a\)走\(b\)的概率,当\(a=b\)时为\(p[a]\),否则为\(mov[a]\)

然后把二元组映射到大小为\(n^2\)的一维数组,高斯消元,注意\(f(s,t)=1\)

时间复杂度:\(O(n^6)\)

#include <algorithm>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std; const int N = 25; int n, m, s, t, deg[N];
double mov[N], p[N];
vector<int> G[N]; double calc(int u, int v) {
return u == v ? p[u] : mov[u];
} int pos(int u, int v) {
return (u - 1) * n + v;
} double a[N * N][N * N]; void gauss(int n) {
for(int i = 1, j = 1; i <= n; j = ++ i) {
for(int k = i + 1; k <= n; k ++) if(fabs(a[j][i]) < fabs(a[k][i])) j = k;
if(i != j) for(int k = i; k <= n + 1; k ++) swap(a[j][k], a[i][k]);
for(j = i + 1; j <= n; j ++) {
double z = a[j][i] / a[i][i];
for(int k = i; k <= n + 1; k ++) a[j][k] -= z * a[i][k];
}
}
for(int i = n; i >= 1; i --) {
for(int j = i + 1; j <= n; j ++) a[i][n + 1] -= a[j][n + 1] * a[i][j];
a[i][n + 1] /= a[i][i];
}
} int main() {
scanf("%d%d%d%d", &n, &m, &s, &t);
for(int u, v, i = 1; i <= m; i ++) {
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
deg[u] ++; deg[v] ++;
}
for(int i = 1; i <= n; i ++) {
scanf("%lf", p + i);
G[i].push_back(i);
mov[i] = (1 - p[i]) / deg[i];
}
int k = n * n;
for(int i = 1; i <= n; i ++) {
for(int j = 1; j <= n; j ++) {
int p = pos(i, j); a[p][p] = -1;
if(i == s && j == t) a[p][k + 1] = -1;
for(int x = 0; x < G[i].size(); x ++) {
int u = G[i][x];
for(int y = 0; y < G[j].size(); y ++) {
int v = G[j][y];
if(u == v) continue ;
a[p][pos(u, v)] += calc(u, i) * calc(v, j);
}
}
}
}
gauss(k);
for(int i = 1; i <= n; i ++)
printf("%.6f ", a[pos(i, i)][k + 1]);
return 0;
}

「BZOJ 3270」博物馆「高斯消元」的更多相关文章

  1. [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash)

    [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash) 题面 扔很多次硬币后,用H表示正面朝上,用T表示反面朝上,会得到一个硬币序列.比如HTT表示第一次正面朝上, ...

  2. 「ZOJ 1354」Extended Lights Out「高斯消元」

    题意:给定一个\(5\times 6\)的棋盘的\(01\)状态,每次操作可以使它自己和周围四个格子状态取反,求如何操作,输出一个\(01\)矩阵 题解:这题可以通过枚举第一行的状态然后剩下递推来做, ...

  3. 「中山纪中集训省选组D4T1」折射伤害 高斯消元

    题目描述 在一个游戏中有n个英雄,初始时每个英雄受到数值为ai的伤害,每个英雄都有一个技能"折射",即减少自己受到的伤害,并将这部分伤害分摊给其他人.对于每个折射关系,我们用数对\ ...

  4. BZOJ_3270_博物馆_(高斯消元+期望动态规划+矩阵)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3270 \(n\)个房间,刚开始两个人分别在\(a,b\),每分钟在第\(i\)个房间有\(p[ ...

  5. BZOJ 3143 HNOI2013 游走 高斯消元 期望

    这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...

  6. BZOJ 2337 XOR和路径 | 高斯消元 期望 位运算

    BZOJ 2337 XOR和路径 题解 这道题和游走那道题很像,但又不是完全相同. 因为异或,所以我们考虑拆位,分别考虑每一位: 设x[u]是从点u出发.到达点n时这一位异或和是1的概率. 对于所有这 ...

  7. 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】

    刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...

  8. bzoj 3143: [Hnoi2013]游走 高斯消元

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1026  Solved: 448[Submit][Status] ...

  9. bzoj 2115: [Wc2011] Xor xor高斯消元

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 797  Solved: 375[Submit][Status] ...

随机推荐

  1. git公钥生成以及与coding等联合

    更好用的 https://segmentfault.com/a/1190000002645623 其中 $ ssh -T git@github.comgitbub $ ssh -T git@git.c ...

  2. 开启VMSS Autoscale的报警功能

    VMSS可以自动的实现Scale Out和Scale in.在VMSS做自动操作的时候,可以通过配置通知服务,通知VMSS的状态. 具体实现方式: 1, 在portal中选择"监视器&quo ...

  3. Apache Htpasswd生成和验证密码

    Assuming you create the password using the following command and "myPassword" as the passw ...

  4. Thread之三:Thread Join()的用法

    一.join用法 join()和wait()不会释放锁,join()是Thread的方法,wait()是Object的方法 1.join方法定义在Thread类中,则调用者必须是一个线程 例如: Th ...

  5. DCloud-MUI:HBuilder 安装

    ylbtech-DCloud-MUI:HBuilder 安装 1.返回顶部 1. 2. 3. 4. 2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返 ...

  6. .netcore 在linux 上运行 Helllo World 例子

    要想在linux上运行netcore ,需要在linux 安装netcore SKD 下面分两步完成, 首先我的操作系统是 Ubuntu 14.04 ,不同版本可以参考 官网给出的连接 https:/ ...

  7. 新版本Ubuntu本地提权漏洞复现

    该漏洞在老版本中被修复了,但新的版本还存在漏洞 影响范围:Linux Kernel Version 4.14-4.4,Ubuntu/Debian发行版本 Exp下载地址:http://cyseclab ...

  8. 第七章 Java中的13个原子操作类

    当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i = 1:A线程更新i + 1,B线程也更新i + 1,经过两个线程操作之后可能i不等于3,而是等于2,.因为A和B线 ...

  9. python正则以及collections模块

    正则 一.认识模块  什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是加上.py的后缀,但其实import加载的模块分为四个通用类别 : 1.使用python编写的代码(.p ...

  10. AJAX——XMLHttpRequest对象的使用

    AJAX是web2.0即动态网页的基础,而XMLHttpRequest对象又是AJAX的核心.XMLHttpRequest对象负责将用户信息以异步通信地发送到服务器端,并接收服务器响应信息和数据 一. ...