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 MB Submit: 690 Solved: 269 [Sub ...
- 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 驱逐猪猡
Description 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44, ...
- bzoj 1778: [Usaco2010 Hol]Dotp 驱逐猪猡
Description 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44, ...
- bzoj 1778 [Usaco2010 Hol]Dotp 驱逐猪猡
http://www.elijahqi.win/archives/3299 Description 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= ...
- BZOJ 1778 Usaco2010 Hol Dotp 驱逐猪猡 期望DP+高斯消元
题目大意:给定一个无向图,炸弹从1号节点出发,每个时刻有P/Q的概率爆炸,如果某个时刻没有爆炸,就会等概率沿着随机一条出边走到下一个城市,求最终每个城市的爆炸概率 #include <cmath ...
最新文章
- java根据属性获取对象_java反射工具类--通过指定属性名,获取/设置对象属性值
- 【Teradata】grouping和rollup窗口函数
- Windows完成端口的理解
- python预处理缺失值_[Scikit-Learn] - 数据预处理 - 缺失值(Missing Value)处理
- set built-in function
- 推荐 21 个顶级的 Vue UI 库
- mongodb 字段出现次数_MongoDB数据库
- Makefile之嵌套执行(9)
- mysql存储过程执行报错1175_mysql 数据库 存储过程执行报错的解决办法
- Pytorch 尝试通过强化cpu使用加快训练和推理速度(二)
- form表单中的enctype=multipart/form-data什么意思?
- c 并发操作mysql_MySQL并发控制
- c# winForm使用Aspose.Cells读取CSV文件中文乱码问题
- python实战代码目录信息
- 北航的计算机与技术专业如何,计算机科学与技术考研北航的这个专业怎么样
- mkfs.ext3 快速格式化_U盘数据快速恢复
- 程序员眼中的“鼠标宏”
- Hadoop原理讲解(面试题)
- upc 6605 所罗门王的宝藏
- 基于struts+spring+ibatis的轻量级J2EE开发