题面

题目传送门


分析

令爆炸概率为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 驱逐猪猡 (高斯消元)相关推荐

  1. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 [高斯消元 概率DP]

    1778: [Usaco2010 Hol]Dotp 驱逐猪猡 题意:一个炸弹从1出发p/q的概率爆炸,否则等概率走向相邻的点.求在每个点爆炸的概率 高斯消元求不爆炸到达每个点的概率,然后在一个点爆炸就 ...

  2. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元+期望dp)

    传送门 解题思路 设\(f(x)\)表示到\(x\)这个点的期望次数,那么转移方程为\(f(x)=\sum\frac{f(u)*(1 - \frac{p}{q})}{deg(u)}\),其中\(u\) ...

  3. [BZOJ 1778][Usaco2010 Hol]Dotp 驱逐猪猡

    1778: [Usaco2010 Hol]Dotp 驱逐猪猡 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 690  Solved: 269 [Sub ...

  4. BZOJ 1778 [Usaco2010 Hol]Dotp 驱逐猪猡 ——期望DP

    思路和BZOJ 博物馆很像. 同样是高斯消元 #include <map> #include <ctime> #include <cmath> #include & ...

  5. bzoj 1778: [Usaco2010 Hol]Dotp 驱逐猪猡【dp+高斯消元】

    算是比较经典的高斯消元应用了 设f[i]为i点答案,那么dp转移为f[u]=Σf[v]*(1-p/q)/d[v],意思是在u点爆炸可以从与u相连的v点转移过来 然后因为所有f都是未知数,高斯消元即可( ...

  6. BZOJ 1778 [Usaco2010 Hol] Dotp 驱逐猪猡

    Description 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44, ...

  7. bzoj 1778: [Usaco2010 Hol]Dotp 驱逐猪猡

    Description 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44, ...

  8. bzoj 1778 [Usaco2010 Hol]Dotp 驱逐猪猡

    http://www.elijahqi.win/archives/3299 Description 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= ...

  9. BZOJ 1778 Usaco2010 Hol Dotp 驱逐猪猡 期望DP+高斯消元

    题目大意:给定一个无向图,炸弹从1号节点出发,每个时刻有P/Q的概率爆炸,如果某个时刻没有爆炸,就会等概率沿着随机一条出边走到下一个城市,求最终每个城市的爆炸概率 #include <cmath ...

最新文章

  1. java根据属性获取对象_java反射工具类--通过指定属性名,获取/设置对象属性值
  2. 【Teradata】grouping和rollup窗口函数
  3. Windows完成端口的理解
  4. python预处理缺失值_[Scikit-Learn] - 数据预处理 - 缺失值(Missing Value)处理
  5. set built-in function
  6. 推荐 21 个顶级的 Vue UI 库
  7. mongodb 字段出现次数_MongoDB数据库
  8. Makefile之嵌套执行(9)
  9. mysql存储过程执行报错1175_mysql 数据库 存储过程执行报错的解决办法
  10. Pytorch 尝试通过强化cpu使用加快训练和推理速度(二)
  11. form表单中的enctype=multipart/form-data什么意思?
  12. c 并发操作mysql_MySQL并发控制
  13. c# winForm使用Aspose.Cells读取CSV文件中文乱码问题
  14. python实战代码目录信息
  15. 北航的计算机与技术专业如何,计算机科学与技术考研北航的这个专业怎么样
  16. mkfs.ext3 快速格式化_U盘数据快速恢复
  17. 程序员眼中的“鼠标宏”
  18. Hadoop原理讲解(面试题)
  19. upc 6605 所罗门王的宝藏
  20. 基于struts+spring+ibatis的轻量级J2EE开发

热门文章

  1. 古人的名与字、号、讳、谥有什么区别
  2. 正则表达式爬取红牛分公司数据
  3. 网易云信IM即时通讯聊天源码SDK 并发高轻松万人并发稳定不丢消息 后端PHP 前端 安卓Java
  4. zip包怎么解压oracle,使用jar与zip压缩解压文件的区别
  5. Java #JDK下载以及环境配置
  6. Linux指令和对应的英文全称,Linux单横杠和双横杠的区别
  7. Android三方依赖冲突及Gradle的exclude使用
  8. vue页面白屏的原因及优化
  9. 使用WEX5移动开发工具制作仿淘宝APP
  10. 2019年南京大学计算机考研分数线,南京大学2019年考研复试分数线已公布