BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 (高斯消元)
题面
分析
令爆炸概率为PPP。设 f(i)=∑k=0∞pk(i)\large f(i)=\sum_{k=0}^{\infty}p_k(i)f(i)=∑k=0∞pk(i),pk(i)p_k(i)pk(i)表示经过kkk步走到iii的概率,那么在iii点结束的概率就为f(i)∗Pf(i)*Pf(i)∗P。
看看f(i)f(i)f(i)满足什么转移方程式。如下
f(i)=∑i−j(f(j)∗(1−P)/dj)\large f(i)=\sum_{i-j}(f(j)*(1-P)/d_j)f(i)=i−j∑(f(j)∗(1−P)/dj)
特别的,对于起点SSS
f(S)=∑S−j(f(j)∗(1−P)/dj)+1\large f(S)=\sum_{S-j}(f(j)*(1-P)/d_j)+1f(S)=S−j∑(f(j)∗(1−P)/dj)+1
那么我们将左边移到右边,再把f(S)f(S)f(S)的等式中+1+1+1移到左边,就得到一个nnn元方程组,高斯消元计算即可。
不知为什么原因WA?
这道题嘴上说着"误差不超过(1e-6)的答案会被接受",但其实没有SPJ,必须输出九位小数,那么问题出现了,由于精度问题,高斯消元本该得到的答案为000,但却得到了负零点几,那么直接输出就会输出"-0.000000000",于是WA也。
所以我们要在输出时判断一下是不是小于(1e-9)就行了。
不过网上大多题解都是将等式右面往左边移,系数就全部取反了,这样也能过。不过为了避免输出-0,输出小数都还是特判一下吧。
CODE(左往右+特判)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 305;
const double eps = 1e-15;
int n, m, A, B, d[MAXN];
double P, a[MAXN][MAXN];
inline void Guass(int N) {
for(int j = 1; j <= N; ++j) {
if(!a[j][j]) {
for(int i = j+1; i <= N; ++i)
if(a[i][j]) {
for(int k = j; k <= N+1; ++k)
swap(a[i][k], a[j][k]);
break;
}
}
for(int i = j+1; i <= N; ++i) {
double v = a[i][j] / a[j][j];
for(int k = j; k <= N+1; ++k)
a[i][k] -= v*a[j][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, &A, &B); P = (double)A/B;
for(int i = 1, x, y; i <= m; ++i)
scanf("%d%d", &x, &y), a[x][y] += 1, a[y][x] += 1, ++d[x], ++d[y];
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= n; ++j) {
if(d[j]) a[i][j] /= d[j];
a[i][j] *= (1-P);
}
a[i][i] -= 1;
}
a[1][n+1] = -1;
Guass(n);
for(int i = 1; i <= n; ++i)
printf("%.9f\n", fabs(a[i][n+1]*P) < (1e-9) ? 0 : a[i][n+1]*P);
}
CODE2(右移左+无特判)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 305;
const double eps = 1e-15;
int n, m, A, B, d[MAXN];
double P, a[MAXN][MAXN];
inline void Guass(int N) {
for(int j = 1; j <= N; ++j) {
if(!a[j][j]) {
for(int i = j+1; i <= N; ++i)
if(a[i][j]) {
for(int k = j; k <= N+1; ++k)
swap(a[i][k], a[j][k]);
break;
}
}
for(int i = j+1; i <= N; ++i) {
double v = a[i][j] / a[j][j];
for(int k = j; k <= N+1; ++k)
a[i][k] -= v*a[j][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, &A, &B); P = (double)A/B;
for(int i = 1, x, y; i <= m; ++i)
scanf("%d%d", &x, &y), a[x][y] += 1, a[y][x] += 1, ++d[x], ++d[y];
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= n; ++j) {
if(d[j]) a[i][j] /= d[j];
a[i][j] *= (P-1);
}
a[i][i] += 1;
}
a[1][n+1] = 1;
Guass(n);
for(int i = 1; i <= n; ++i)
printf("%.9f\n", a[i][n+1]*P);
}
BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 (高斯消元)的更多相关文章
- BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 [高斯消元 概率DP]
1778: [Usaco2010 Hol]Dotp 驱逐猪猡 题意:一个炸弹从1出发p/q的概率爆炸,否则等概率走向相邻的点.求在每个点爆炸的概率 高斯消元求不爆炸到达每个点的概率,然后在一个点爆炸就 ...
- BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元+期望dp)
传送门 解题思路 设\(f(x)\)表示到\(x\)这个点的期望次数,那么转移方程为\(f(x)=\sum\frac{f(u)*(1 - \frac{p}{q})}{deg(u)}\),其中\(u\) ...
- BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡
1778: [Usaco2010 Hol]Dotp 驱逐猪猡 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 563 Solved: 216[Submi ...
- BZOJ 1778 [Usaco2010 Hol]Dotp 驱逐猪猡 ——期望DP
思路和BZOJ 博物馆很像. 同样是高斯消元 #include <map> #include <ctime> #include <cmath> #include & ...
- bzoj 1778: [Usaco2010 Hol]Dotp 驱逐猪猡【dp+高斯消元】
算是比较经典的高斯消元应用了 设f[i]为i点答案,那么dp转移为f[u]=Σf[v]*(1-p/q)/d[v],意思是在u点爆炸可以从与u相连的v点转移过来 然后因为所有f都是未知数,高斯消元即可( ...
- bzoj 1778 [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元)
[题意] 炸弹从1开始运动,每次有P/Q的概率爆炸,否则等概率沿边移动,问在每个城市爆炸的概率. [思路] 设M表示移动一次后i->j的概率.Mk为移动k次后的概率,则有: Mk=M^k 设S= ...
- BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 概率与期望+高斯消元
这个还挺友好的,自己相对轻松能想出来~令 $f[i]$ 表示起点到点 $i$ 的期望次数,则 $ans[i]=f[i]\times \frac{p}{q}$ #include <cmath> ...
- 【BZOJ】1778: [Usaco2010 Hol]Dotp 驱逐猪猡
[题意]给定无向图,炸弹开始在1,在每个点爆炸概率Q=p/q,不爆炸则等概率往邻点走,求在每个点爆炸的概率.n<=300. [算法]概率+高斯消元 [题解]很直接的会考虑假设每个点爆炸的概率,无 ...
- BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元
BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...
随机推荐
- [转帖]CentOS 8.0.1905 和CentOS Stream(滚动发行)正式发布
CentOS 8.0.1905 和CentOS Stream(滚动发行)正式发布 https://zhuanlan.zhihu.com/p/84001292 还发现openssl 的 版本太高 不兼容 ...
- [转帖]英特尔首次使用其3D堆叠架构演示Lakefield芯片设计
英特尔首次使用其3D堆叠架构演示Lakefield芯片设计 http://www.chinapeace.org.cn/keji/201904/2812749.html 这段时间学习最大的收获: . 发 ...
- 将 MathType 公式转换为 Word 自带公式
以下操作是基于Office 365以及MathType 6.9b平台.有网友留言说第四步没出现「转换为 Office Math」选项,这个我就不清楚了,难道是只有Office 365才支持? 打开Ma ...
- GB2312、GBK、GB18030 这几种字符集的主要区别
1 GB2312-80 GB 2312 或 GB 2312-80 是中国国家标准简体中文字符集,全称<信息交换用汉字编码字符集·基本集>,又称 GB 0,由中国国家标准总局发布,1981 ...
- S03_CH13_ZYNQ A9 TCP UART双核AMP例程
S03_CH13_ZYNQ A9 TCP UART双核AMP例程 13.1概述 ZYNQ中存在两个独立的ARM核,在很多应用场景中往往只需使用其中的1个核心即可.然而,对于复杂的设计,例如多任务,并行 ...
- Mac机安装RedisCluster
版本信息 mac版本:10.14.5 redis版本:5.0.7 Step 1 : 安装redis-cli命令 安装redis-cli命令方法有N种,这里只列举一种,参考地址:<在 Mac 上搭 ...
- (二)CXF之用CXF官方工具生成客户端Client
一.CXF工具的下载与使用 登录CXF官网:http://cxf.apache.org/download.html 下载,本系列使用的是3.1.5版本: 添加path环境变量 二.案例 2.1 发布w ...
- C#如何调用C++(基础篇)
闲暇之余,记一下笔记!记录一下c#如何调用C++的动态库(dll). 步骤: 一.创建一个C++类,例如: AddOperate.h extern _declspec(dllexport) int S ...
- Windows 下 mysql 5.7 设置 区分大小写(敏感),设置默认编码 utf8mb4
修改编码 c盘下搜索 C:\ProgramData\MySQL\MySQL Server 5.7 在该my.ini文件下进行配置修改 [client] default-character-set = ...
- 【es6】将2个数组合并为一个数组
//第一种 一个数组中的值为key 一个数组中的值为value let arr1 = ['内存','颜色','尺寸']; let arr2 = [1,2,3]; let temp = arr1.map ...