看到题面的那一刻,我是绝望的ORZ

图论加概率期望加好像不沾边的高斯消元???我人直接傻掉

还没学过概率期望的我果断向题解屈服了(然后还是傻掉了两节课来找线性方程..

Description

奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡。猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城。这些城市由M (1 <= M <= 44,850)条由两个不同端点A_j和B_j (1 <= A_j<= N; 1 <= B_j <= N)表示的双向道路连接。保证城市1至少连接一个其它的城市。 一开始臭气弹会被放在城市1。每个小时(包括第一个小时),它有P/Q (1 <= P <=1,000,000; 1 <= Q <= 1,000,000)的概率污染它所在的城市。如果这个小时内它没有污染它所在的城市,那麽它随机地选择一条道路,在这个小时内沿着这条道路走到一个新的城市。可以离开这个城市的所有道路被选择的概率均等。 因为这个臭气弹的随机的性质,奶牛们很困惑哪个城市最有可能被污染。给定一个猪猡文明的地图和臭气弹在每个小时内爆炸的概率。计算每个城市最终被污染的概率。

solution

首先由一眼看穿法不难证出,城市被污染的概率等于该城市期望经过次数乘炸弹爆炸的概率。

那么城市的期望经过怎么求呢? 可以采用dp的思想,一个城市的概率经过次数可以通过累加可到达它的前置城市期望次数与转移到该城市的概率求得。

对于城市u的期望经过次数fu,有:

f[u]=Σ((1/out[v])×(1-p/q)×f[v]) (out为点的出度,u,v间连通)

但由于u,v互相转移,且转移u时v并没完成转移,所以不能按dp打,于是用高斯消元解线性多元方程组来解决这个问题。

可将转移方程看作:

f[v1]×a[v1]+f[v2]×a[v2]+...+f[vn]×a[vn]=f[u] ,(a[i]=(1/out[i])×(1-p/q))

移项,得:

-f[vu]+f[v1]×a[v1]+f[v2]×a[v2]+...+f[vn]×a[vn]=0

然后就能开始愉快地解方程了。


注意:因为出发点为城市1,所以城市1的期望经过次数应加一,所以f[1]系数为负的式子等号右应该是-1而不是0。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const double eps=1e-14;
double k,p,q,t,a[302][301];
int out[301],st[89701],to[89701],head[301],nex[89701],num,m,n;
void gauss()
{
for(int i=1;i<=n;i++)
{
int r=i;
for(int j=i+1;j<=n;j++)
if(fabs(a[j][i])>fabs(a[r][i]))
r=j;
if(r!=i)
for(int j=i;j<=n+1;j++)
swap(a[r][j],a[i][j]);
for(int j=i+1;j<=n;j++)
{
double temp=a[j][i]/a[i][i];
for(int k=i;k<=n+1;k++)
a[j][k]-=a[i][k]*temp;
}
}
for(int i=n;i>0;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%lf%lf",&n,&m,&p,&q);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
st[++num]=x; to[num]=y; nex[num]=head[y]; head[y]=num;//用终点建边
st[++num]=y; to[num]=x; nex[num]=head[x]; head[x]=num;
out[x]++; out[y]++;
}
k=p/q; for(int i=1;i<=n;i++)
{
a[i][i]=-1;
for(int j=head[i];j!=0;j=nex[j])
a[i][st[j]]=(1-k)/out[st[j]];
}
a[1][n+1]=-1;
gauss(); for(int i=1;i<=n;i++)
if(fabs(a[i][n+1])<eps) a[i][n+1]=0;
for(int i=1;i<=n;i++)
printf("%.9lf\n",a[i][n+1]*k);
return 0;
}

蒟蒻代码QAQ

[luogu2973]driving out the piggies 驱逐猪猡【高斯消元+概率DP】的更多相关文章

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

    题面 题目传送门 分析 令爆炸概率为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 ...

  4. BZOJ 2337: [HNOI2011]XOR和路径 [高斯消元 概率DP]

    2337: [HNOI2011]XOR和路径 题意:一个边权无向连通图,每次等概率走向相连的点,求1到n的边权期望异或和 这道题和之前做过的高斯消元解方程组DP的题目不一样的是要求期望异或和,期望之间 ...

  5. LightOJ 1151 - Snakes and Ladders 高斯消元+概率DP

    首先来个期望的论文,讲的非常好,里面也提到了使用线性方程组求解,尤其适用于有向图的期望问题. 算法合集之<浅析竞赛中一类数学期望问题的解决方法> http://www.lightoj.co ...

  6. Broken robot CodeForces - 24D (三对角矩阵简化高斯消元+概率dp)

    题意: 有一个N行M列的矩阵,机器人最初位于第i行和第j列.然后,机器人可以在每一步都转到另一个单元.目的是转到最底部(第N个)行.机器人可以停留在当前单元格处,向左移动,向右移动或移动到当前位置下方 ...

  7. light oj 1151 - Snakes and Ladders 高斯消元+概率DP

    思路: 在没有梯子与蛇的时候很容易想到如下公式: dp[i]=1+(∑dp[i+j])/6 但是现在有梯子和蛇也是一样的,初始化p[i]=i; 当有梯子或蛇时转移为p[a]=b; 这样方程变为: dp ...

  8. UVa 10828 Back to Kernighan-Ritchie 高斯消元+概率DP

    题目来源:UVa 10828 Back to Kernighan-Ritchie 题意:从1開始 每次等概率从一个点到和他相邻的点 有向 走到不能走停止 求停止时每一个点的期望 思路:写出方程消元 方 ...

  9. bzoj 2337 高斯消元+概率DP

    题目大意: 每条路径上有一个距离值,从1走到N可以得到一个所有经过路径的异或和,求这个异或和的数学期望 这道题直接去求数学期望的DP会导致很难列出多元方程组 我们可以考虑每一个二进制位从1走到N的平均 ...

随机推荐

  1. vue从mock数据过渡到使用后台接口

    说明: 最近在搭建一个前端使用vue-element-admin,后端使用springBoot的项目. 由于vue-element-admin使用的是mock的模拟数据跑起来的项目,所以在开发过程中难 ...

  2. C语言学习笔记---3.字符串格式化输入输出

    1.C语言字符串 字符串(character string)是一个或多个字符的序列,例如:"Zing went the strings of my heart!" C语言没有专门用 ...

  3. java版gRPC实战之五:双向流

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. 洛谷P1582——倒水(进制,数学)

    https://www.luogu.org/problem/show?pid=1582 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了 ...

  5. python 打字小游戏

    最近随便用python的pygame编了这个打字小游戏 只要有字母调到窗口底部就结束 上代码: import pygame.freetype import sys import random pyga ...

  6. TP5框架下实现数据库的备份功能-tp5er/tp5-databackup

    1.安装扩展 方法一: composer require tp5er/tp5-databackup dev-master 方法二 composer.json: "require": ...

  7. Centos8.X 搭建Grafana+Jmeter+Influxdb 性能实时监控平台

    前言 本篇文章引用了小菠萝测试笔记,大部分内容非原创,基于自身实操过程中,完善了部分. 本篇随笔是在Linux上搭建的,后面会补充在docker以及k8s上如何部署安装 工具介绍 工具 介绍 Jmet ...

  8. Shell系列(15)- 数值运算方法

    数值运算-方法1 declare -i [root@localhost ~]# aa=11 [root@localhost ~]# aa=22   #给变量aa和bb赋值 [root@localhos ...

  9. Modern PHP 使用生成器yield 处理csv文件 Generator

    * 使用生成器处理csv文件 <?php function getRows($file) { $handle = fopen($file, 'rb'); if ($handle === fals ...

  10. three.js 模型拖动之DragControls控制器

    需求: 拖动场景内的模型 方案: 增加控制器DragControls 1.引入控制器 import { OrbitControls } from "three/examples/jsm/co ...