「BZOJ 3270」博物馆「高斯消元」
应该算高斯消元经典题了吧。
题意:一个无向连通图,有两个人分别在\(s,t\),若一个人在\(u\),每一分钟有\(p[u]\)的概率不动,否则随机前往一个相邻的结点,求在每个点相遇的概率
题解:
首先求一个\(mov[i]=\frac{1-p[i]}{deg[i]}\)表示结点i每次移动到某个相邻结点的概率,\(deg[i]\)表示结点\(i\)的度
为了方便,我们把每个点向自己连条边,下面写式子好些(注意度数不能增加)
然后考虑设计状态\(f(a,b)\)表示第一个人在\(a\),第二个人在\(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」博物馆「高斯消元」的更多相关文章
- [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash)
[BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash) 题面 扔很多次硬币后,用H表示正面朝上,用T表示反面朝上,会得到一个硬币序列.比如HTT表示第一次正面朝上, ...
- 「ZOJ 1354」Extended Lights Out「高斯消元」
题意:给定一个\(5\times 6\)的棋盘的\(01\)状态,每次操作可以使它自己和周围四个格子状态取反,求如何操作,输出一个\(01\)矩阵 题解:这题可以通过枚举第一行的状态然后剩下递推来做, ...
- 「中山纪中集训省选组D4T1」折射伤害 高斯消元
题目描述 在一个游戏中有n个英雄,初始时每个英雄受到数值为ai的伤害,每个英雄都有一个技能"折射",即减少自己受到的伤害,并将这部分伤害分摊给其他人.对于每个折射关系,我们用数对\ ...
- BZOJ_3270_博物馆_(高斯消元+期望动态规划+矩阵)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3270 \(n\)个房间,刚开始两个人分别在\(a,b\),每分钟在第\(i\)个房间有\(p[ ...
- BZOJ 3143 HNOI2013 游走 高斯消元 期望
这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...
- BZOJ 2337 XOR和路径 | 高斯消元 期望 位运算
BZOJ 2337 XOR和路径 题解 这道题和游走那道题很像,但又不是完全相同. 因为异或,所以我们考虑拆位,分别考虑每一位: 设x[u]是从点u出发.到达点n时这一位异或和是1的概率. 对于所有这 ...
- 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】
刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...
- bzoj 3143: [Hnoi2013]游走 高斯消元
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1026 Solved: 448[Submit][Status] ...
- bzoj 2115: [Wc2011] Xor xor高斯消元
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 797 Solved: 375[Submit][Status] ...
随机推荐
- git公钥生成以及与coding等联合
更好用的 https://segmentfault.com/a/1190000002645623 其中 $ ssh -T git@github.comgitbub $ ssh -T git@git.c ...
- 开启VMSS Autoscale的报警功能
VMSS可以自动的实现Scale Out和Scale in.在VMSS做自动操作的时候,可以通过配置通知服务,通知VMSS的状态. 具体实现方式: 1, 在portal中选择"监视器&quo ...
- Apache Htpasswd生成和验证密码
Assuming you create the password using the following command and "myPassword" as the passw ...
- Thread之三:Thread Join()的用法
一.join用法 join()和wait()不会释放锁,join()是Thread的方法,wait()是Object的方法 1.join方法定义在Thread类中,则调用者必须是一个线程 例如: Th ...
- DCloud-MUI:HBuilder 安装
ylbtech-DCloud-MUI:HBuilder 安装 1.返回顶部 1. 2. 3. 4. 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返 ...
- .netcore 在linux 上运行 Helllo World 例子
要想在linux上运行netcore ,需要在linux 安装netcore SKD 下面分两步完成, 首先我的操作系统是 Ubuntu 14.04 ,不同版本可以参考 官网给出的连接 https:/ ...
- 新版本Ubuntu本地提权漏洞复现
该漏洞在老版本中被修复了,但新的版本还存在漏洞 影响范围:Linux Kernel Version 4.14-4.4,Ubuntu/Debian发行版本 Exp下载地址:http://cyseclab ...
- 第七章 Java中的13个原子操作类
当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i = 1:A线程更新i + 1,B线程也更新i + 1,经过两个线程操作之后可能i不等于3,而是等于2,.因为A和B线 ...
- python正则以及collections模块
正则 一.认识模块 什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是加上.py的后缀,但其实import加载的模块分为四个通用类别 : 1.使用python编写的代码(.p ...
- AJAX——XMLHttpRequest对象的使用
AJAX是web2.0即动态网页的基础,而XMLHttpRequest对象又是AJAX的核心.XMLHttpRequest对象负责将用户信息以异步通信地发送到服务器端,并接收服务器响应信息和数据 一. ...