题面

题目传送门


分析

令爆炸概率为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 MBSubmit: 563  Solved: 216[Submi ...

  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 驱逐猪猡(高斯消元)

    [题意] 炸弹从1开始运动,每次有P/Q的概率爆炸,否则等概率沿边移动,问在每个城市爆炸的概率. [思路] 设M表示移动一次后i->j的概率.Mk为移动k次后的概率,则有: Mk=M^k 设S= ...

  7. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 概率与期望+高斯消元

    这个还挺友好的,自己相对轻松能想出来~令 $f[i]$ 表示起点到点 $i$ 的期望次数,则 $ans[i]=f[i]\times \frac{p}{q}$ #include <cmath> ...

  8. 【BZOJ】1778: [Usaco2010 Hol]Dotp 驱逐猪猡

    [题意]给定无向图,炸弹开始在1,在每个点爆炸概率Q=p/q,不爆炸则等概率往邻点走,求在每个点爆炸的概率.n<=300. [算法]概率+高斯消元 [题解]很直接的会考虑假设每个点爆炸的概率,无 ...

  9. BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元

    BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...

随机推荐

  1. java访问磁盘文件

    转载,务必写上原文链接 !(尊重与你分享知识的人) 目录 文件 File 对象 VS FileDescriptor 对象 文件讲解java访问磁盘文件过程 fileReader.read() 图解ja ...

  2. vector简单常用用法

    Vector是什么? vector翻译为向量,从某种角度来说就是一个可以变长的数组,它会根据需要自动扩充数组的容量,除此之外其是一个STL中的模板类,其 还具有一些内部的方法. Vector的使用方法 ...

  3. 1233: 输出杨辉三角前n行(Java)

    WUSTOJ 1233: 输出杨辉三角前n行 题目 原题链接 Description 输出杨辉三角前n行. Input 输入一个数n(n <= 9) Output 输出杨辉三角前n行.(注意行末 ...

  4. ubuntu maven jdk

    https://blog.csdn.net/zrgood123/article/details/82894447 这里是将环境变量配置在etc/profile,即为所有用户配置JDK环境. 使用命令打 ...

  5. (一)mybatis介绍

    一.mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...

  6. (七)shiro之编码/加密

    一.编码/解码 使用Base64编码/解码操作 public class TestMain { public static void main(String[] args) { SecurityMan ...

  7. Spring基础篇——DI/IOC和AOP原理初识

    DI(Dependency Injection),依赖注入,和我们常听说的另一个概念 IOC(控制反转)其实归根结底实现的功能是相同的,只是同样的功能站在不同的角度来阐述罢了.这里博主就不去过多的辨析 ...

  8. ASP.NET MVC或者.net Core mvc 页面使用富文本控件的 保存问题

    https://blog.csdn.net/leftfist/article/details/69629394 目前在做的项目存在XSS安全漏洞! 原因是有一些页面使用了富文本编辑框,为了使得其内容可 ...

  9. 通过gpio控制一个进程开启或关闭

    目标: 板子上有个进程需要通过读取gpio的值, 当gpio值为1 时, 开启指定的进程,当gpio为0时, 杀掉这个指定的进程. #include <stdio.h> int main( ...

  10. MyEclipse j2ee工程 WEB-INF 目录内容显示

    公司项目,使用的ant打包技术,,,蛋疼刚开始以为每次改个java代码都要ant 构建编译一把3-4分钟,很没有效率,, 然后实际使用中发下,可以用 auto building 和tomcat 的re ...