洛谷 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. vue自定义指令笔记

    https://cn.vuejs.org/v2/guide/custom-directive.html 在vue中,有时候我们会把抽象的方法封装为一个自定义指令,多个地方共用 比如:拖拽指令 < ...

  2. cairosvg使用过程中需要注意的问题

    在使用pygal的过程中,图片默认保存的是svg格式,如果需要生成本地的图片需要进行一些配置.下面是在摸索时的一些流程: 1.查看pygal的函数,dir(pygal.bar),发现其支持保存为png ...

  3. 【python爬虫】cookie & session

    一.什么是cookie? cookie是指网站为了鉴别用户身份,进行会话跟踪而存储在客户端本地的数据. 二.什么是session? 本来的含义是指有始有终的一些列动作,而在web中,session对象 ...

  4. php获取url中的参数

    // 获取url参数值function is_set_param($param){ $current_url = $_SERVER["QUERY_STRING"]; $arr = ...

  5. js函数只执行一次,函数重写,变量控制与闭包三种做法

    一.情景需求 调用后台接口需要附带token信息,那么在每个请求的头部添加token的做法就不太优雅了:一个网站请求100次,那就得写添加100次token,假设某天接口有所变动,改起来就十分麻烦了. ...

  6. pandas 学习 第5篇:DataFrame - 访问数据框

    数据框是用于存储数据的二维结构,分为行和列,一行和一列的交叉位置是一个cell,该cell的位置是由行索引和列索引共同确定的.可以通过at/iat,或loc/iloc属性来访问数据框的元素,该属性后跟 ...

  7. 【git】代码回退指定commit

    [注意:如果提交的错误代码较少,可以在本地修改成 commit之前的正确代码样子,然后再提交一次即可.不用麻烦的操作回滚.] 开发人员错误将代码提交到gitlab的远程dev分支,回滚方法如下: 1. ...

  8. wpf datagrid field to image converter 字段 图片转化器

    <DataGridTemplateColumn Header="Binding"> <DataGridTemplateColumn.CellTemplate> ...

  9. Python【day 15】基本数据类型-int str bool list

    '''''' ''' 1 python的定义 是一门弱类型的解释性的高级编程语言 这里的高级是相对低级(例如:汇编语言等) 高级编程语言和低级编程语言的区别 1.前者更接近于人的理解--字母组成的语法 ...

  10. (转载)林轩田机器学习基石课程学习笔记1 — The Learning Problem

    (转载)林轩田机器学习基石课程学习笔记1 - The Learning Problem When Can Machine Learn? Why Can Machine Learn? How Can M ...