洛谷 P4316 绿豆蛙的归宿

洛谷传送门

题目背景

随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿。

题目描述

给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点。绿豆蛙从起点出发,走向终点。 到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K 。 现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?

输入格式

第一行: 两个整数 N M,代表图中有N个点、M条边 第二行到第 1+M 行: 每行3个整数 a b c,代表从a到b有一条长度为c的有向边

输出格式

从起点到终点路径总长度的期望值,四舍五入保留两位小数。

题意翻译

「Poetize3」

输入输出样例

输入 #1复制

输出 #1复制

说明/提示

对于20%的数据 N<=100

对于40%的数据 N<=1000

对于60%的数据 N<=10000

对于100%的数据 N<=100000,M<=2*N

题解:

看到期望先想想期望DP(大佬@zcs0724说期望题基本都是期望DP。)

附:期望的概念:(摘自本蒟蒻的博客)

如果\(X\)是一个随机变量,它的取值分别是\(x_1,x_2\cdots x_n\),那么一个随机事件就可以表示为\(X=X_i\),假设它的概率是\(P(X=X_i)=p_i\),那么它的期望被称为\(E(X)\),有:

\[E(X)=\sum_{i=1}^{n}p_i\times x_i
\]

通俗地理解,一个随机变量的期望就是这个随机变量的所有取值与其概率的乘积之和


如果对概率论的其他概念还有知识盲区的,敬请翻看本蒟蒻的这篇博客:

概率论相关概念详解

那么按这个思路:

设\(E[x]\)为点\(x\)到终点\(n\)的路径期望总和。那么很显然地,答案为\(E[1]\),而初值\(E[n]\)为\(0\)。那么自然而然地,我们想到反向建图,从终点开始DP。从后往前开始逆推,最后得出\(E[1]\)的值。

根据逆推的过程和期望的定义,那么每一个节点的\(E[x]\)就应该是这个节点的子节点(这时还是正着的图)的\(E\)值加上这个子节点到\(x\)的边长除以这个节点的出度。

也就是:

\[E[x]=\sum_{y\in to}\{(E[y]+val[i])\times\frac{1}{to}\}
\]

我们实现这个逆推可以使用深搜,但是深搜常数比较大,所以我们选择拓扑排序(效果是一样的)。

具体实现的细节是:

我们建图的时候不用建两遍,直接一遍建完反向边即可。但是,我们记录度的时候还是要按原来的记录,而且要记录两遍,一遍随拓扑排序的过程而改变,另一个作为计算期望值的参数一直保持不变。

这也是最容易出锅的点。

代码:

#include<cstdio>
#include<queue>
using namespace std;
const int maxn=1e5+10;
int n,m;
int tot,head[maxn],to[maxn<<1],val[maxn<<1],nxt[maxn<<1];
int out_degree[maxn],degree[maxn];
double f[maxn];
queue<int> q;
void add(int x,int y,int z)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
val[tot]=z;
}
int main()
{
scanf("%d%d",&n,&m);
q.push(n);
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(y,x,z);
out_degree[x]++;
degree[x]++;
}
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
f[y]+=(f[x]+val[i])/degree[y];
out_degree[y]--;
if(!out_degree[y])
q.push(y);
}
}
printf("%.2lf",f[1]);
return 0;
}

洛谷 P4316 绿豆蛙的归宿的更多相关文章

  1. 洛谷P4316 绿豆蛙的归宿(期望)

    题意翻译 「Poetize3」 题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出 ...

  2. 洛谷P4316绿豆蛙的归宿——期望

    题目:https://www.luogu.org/problemnew/show/P4316 期望水题,从终点向起点推,因为是DAG,所以拓扑序推过去即可. 代码如下: #include<ios ...

  3. 洛谷P4316 绿豆蛙的归宿

    一眼看去,这不是高斯消元吗? 然后发现数据范围是100000... 然后发现是DAG...直接拓扑序递推即可. 边(x, y,z)的贡献是P(x) * z / out[x] #include < ...

  4. 2018.07.22 洛谷P4316 绿豆蛙的归宿(概率dp)

    传送门 简单的递推. 由于是DAG" role="presentation" style="position: relative;">DAGDA ...

  5. 洛谷 P4316绿豆蛙的归宿

    题目描述 记f[i]表示经过i号点的概率. 那么点v从点u到达的概率=经过点u的概率/点u的出度.由于v可以由多个点走到,所以f[v]+=f[u]/out[u]. 计算f的过程可以在拓扑中完成,同时可 ...

  6. 洛谷$P4316$ 绿豆蛙的归宿 期望

    正解:期望 解题报告: 传送门! 看懂题目还是挺水的$(bushi$ 三个方法,但因为题目太水了懒得一一介绍了,,,反正都是期望,,,$so$随便港个最简单的趴$QwQ$ 直接考虑每条边的贡献,就会是 ...

  7. 洛谷4316 绿豆蛙的归宿(DAG递推/概率dp)

    题目大意: 给定一个DAG,求起点到终点的路径长度期望 根据题意可以知道每一条边都有一定概率被走到 那么\(\displaystyle\begin{aligned} Ans = \sum_{e \in ...

  8. P4316 绿豆蛙的归宿(期望)

    P4316 绿豆蛙的归宿 因为非要用bfs所以稍微麻烦一点qwq(大家用的都是dfs) 其实问题让我们求的就是经过每条边的概率*边权之和 我们可以用bfs把图遍历一遍处理概率,顺便把每条边的概率*边权 ...

  9. Luogu P4316 绿豆蛙的归宿

    P4316 绿豆蛙的归宿 题意翻译 「Poetize3」 题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边 ...

随机推荐

  1. 【CentOS7】CentOS7各个版本镜像下载地址(转)

    链接:https://www.cnblogs.com/caidingyu/p/10679422.html # CentOS7.6 下载地址       # CentOS-7-x86_64-DVD-18 ...

  2. vue--npm的使用

    npm介绍 NPM 全称 Node Package Manager,它是 JavaScript 的包管理工具, 并且是 Node.js 平台的默认包管理工具.通过NPM 可以安装.共享.分发代码,管理 ...

  3. python--各种锁机制归纳整理

    Q:为什么要用锁?什么样的业务场景下需要用锁? 就拿之前的工单系统来说,当审批方式为角色组审批时,代表该角色组内任意一人审批即可,这时,该角色组内成员的系统上都是可以显示审批按钮,如果此时A审批员和B ...

  4. SpringMVC拦截器和数据校验

    1.什么是拦截器 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录请求 ...

  5. centos7下mysql5.7的安装与配置

    centos7下MySQL5.7的安装与配置 下载 下载地址 根据系统和版本选择红框中的四个RPM包下载即可,然后放到centos7系统中的/opt目录下,等待稍后安装. 安装前的准备 1. 检查系统 ...

  6. 用户和登录的ID、Name和SID

    SQL Server的安全主体主要分为Login.User和Role,不仅有ID属性,还有Name属性和SID属性,SID是指Security ID.在查看用户和登录的时候,受到模拟上下文的影响.当执 ...

  7. Python中文件操作2——shutil模块

    1 文件操作 文件有很多的操作,之前的文件操作中介绍了内建函数对文件的打开.读取以及写入,这三种操作是对文件基本的使用.文件还有复制.删除.移动.改变文件的属主属组等操作.下面主要看os模块和shut ...

  8. 前端之CSS1

    CSS基本语法和引入方式 CSS介绍 为了让网页元素的样式更加丰富,也为了让网页的内容和样式能拆分开,CSS由此而诞生,CSS是 Cascading Style Sheets 的首字母缩写,意思是层叠 ...

  9. oracle学习笔记(十五) PL/SQL语法结构以及使用

    PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言. PL/SQL 是对 SQL 的扩展. 支持多种数据类型,如大对象和 ...

  10. Python中最常用的字符串方法!

    字符串是字符序列.Python中内置的string类代表基于Unicode国际字符集的字符串.除了Python中常见的操作外,字符串还有一些专属于它们的附加方法.下图显示了所有这些可用的方法: Pyt ...