题目大意:

给定一个DAG,求起点到终点的路径长度期望

根据题意可以知道每一条边都有一定概率被走到

那么\(\displaystyle\begin{aligned} Ans = \sum_{e \in E} f_ew_e\end{aligned}\),其中\(E\)是边的集合,\(f_e\)是经过边\(e\)的期望次数,\(w_e\)是边\(e\)的边权

这样我们只需要求经过每一条边的期望次数

对于每一条边,经过这条边的期望次数就是经过这条边起点的期望次数除以这条边起点的出度

这样我们就只需要求经过每一个点的期望次数

由于是DAG,我们在DAG上拓扑排序递推一下即可

在地推的过程中,我们可以顺便求出经过每条边的期望次数

(其实经过某一个点的期望次数就等于它所有入边的期望次数的和,它所有出边的期望次数就等于它的期望次数除以它的出度)

详见代码

#include <cstdio>
#include <iostream> using namespace std; struct edge
{
int v, w, ne;
}a[200010]; int n, m, tmp, top;
int in[100010], out[100010], h[100010], s[100010];
double f[200010], p[100010], ans; int main()
{
scanf("%d%d", &n, &m);
for (int x, y, z, i = 1; i <= m; i++)
{
scanf("%d%d%d", &x, &y, &z);
a[++tmp] = (edge){y, z, h[x]};
h[x] = tmp;
out[x]++;
in[y]++;
}
s[++top] = 1;
p[1] = 1;
while (top > 0)//用一个栈维护所有可以选择的点
{
int x = s[top--];
for (int i = h[x]; i != 0; i = a[i].ne)
{
in[a[i].v]--;
p[a[i].v] += p[x] / out[x];//累加经过一个点的期望次数
f[i] = p[x] / out[x];//计算经过一个边的期望次数
if (in[a[i].v] == 0)
s[++top] = a[i].v;
}
}
for (int i = 1; i <= m; i++)
ans += f[i] * a[i].w;
printf("%.2f\n", ans);
return 0;
}

拓展:如果不是DAG,可以列方程组求解,详见[HNOI2013]游走

洛谷4316 绿豆蛙的归宿(DAG递推/概率dp)的更多相关文章

  1. 洛谷 P4316 绿豆蛙的归宿

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

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

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

  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绿豆蛙的归宿——期望

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

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

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

  7. 洛谷 P4316绿豆蛙的归宿

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

  8. 【BZOJ3036】绿豆蛙的归宿 拓补排序+概率

    [BZOJ3036]绿豆蛙的归宿 Description 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度. ...

  9. [Luogu 4316] 绿豆蛙的归宿

    题目链接 一道基础的 \(DAG\) 上期望 \(DP\). 给出一个有向无环图,起点为 \(1\) 终点为 \(N\),每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点. ...

随机推荐

  1. struts2中常用constant命令配置

    struts.objectFactory这个属性用 于说明Struts2的 对象池创建工厂,Struts2也有自己的对象池,就像Spring那样,在配置文件中你可以引用对象池中的对象,你可以借助于Sp ...

  2. Python函数(十)-装饰器(三)

    如果多个函数想通过一个装饰器来实现不同的功能的话,可以给装饰器传入参数,让装饰器里的函数对参数进行判断,来实现不同的功能 # -*- coding:utf-8 -*- __author__ = &qu ...

  3. python 函数和方法的区别

    一.函数和方法的区别 1.函数要手动传self,方法不用传 2.如果是一个函数,用类名去调用,如果是一个额方法,用对象去调用 举例说明: class Foo(object): def __init__ ...

  4. 前端seo小结,网页代码优化

    seo的目的:提高网站流量 search engine optimization 搜索引擎优化seo search engine marketing 搜索引擎营销sem 权重10个等级 等级越大,权重 ...

  5. CORS实现跨域Ajax

    客户端 #!/usr/bin/env python import tornado.ioloop import tornado.web class MainHandler(tornado.web.Req ...

  6. 安装Oracle 11.2.0.3 Client Win 32-bit

    第一步:安装Oracle 11.2 32-bit数据库1.双击setup文件,进入安装界面 2.选择跳过升级选项 3.设置oracle安装根目录 4.确认选项,没有问题点击“安装” 第二步:创建数据库

  7. android tween动画和Frame动画总结

    tween  动画有四种 //透明度动画 AlphaAnimation aa = (AlphaAnimation) AnimationUtils.loadAnimation(MainActivity. ...

  8. 百度Apollo解析——0.使用VSCode编译Apollo项目

    1.安装微软Visual Studio Code 1.1 方法一 开始之前,首先需要安装Ubuntu Make.虽然Ubuntu Make存在Ubuntu15.04官方库中,但是需要Ubuntu Ma ...

  9. SQl Server 函数篇 数学函数,字符串函数,转换函数,时间日期函数

    数据库中的函数和c#中的函数很相似 按顺序来, 这里价格特别的 print  可以再消息栏里打印东西 数学函数 ceiling()  取上限   不在乎小数点后面有多大,直接忽略 floor()   ...

  10. Condition实现多线程顺序打印

    Condition实现多线程顺序打印: import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.R ...