[Luogu 4316] 绿豆蛙的归宿
一道基础的 \(DAG\) 上期望 \(DP\)。
给出一个有向无环图,起点为 \(1\) 终点为 \(N\),每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点。到达每一个顶点时,如果有 \(K\) 条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 \(\frac{1}{K}\) 。求从起点走到终点的所经过的路径总长度期望是多少。
一开始使经过起点的概率为 \(1\),到起点的期望距离为 \(0\),拓扑推下去,\(GG\)。\(WA\) 了两发,怎么也搞不出来……
其实这道题的期望怎么算是很显然的,可以发现,\(Ans = \sum_{e \in Edge} t_e w_e\),\(t_e\) 为经过一条边的期望次数,即经过这条边起点的期望次数除以这条边起点的出度。
然后可以设状态 \(ex[x]\) 表示点 \(x\) 到终点 \(n\) 的期望路径总长。显然,要求的答案为\(ex[1]\),而且有\(ex[n]=0\)。进行一遍拓扑排序,在拓扑排序的时候进行期望 \(dp\) 的转移。而对于一条有向边,我们假设它由 \(x−>y\),那么有 \(ex[x]=(\frac{1}{degree[x]})∗\sum (ex[y] + w[x−>y])\)。题目就解出来了……
总结一下的话……期望 \(DP\) 也是一种 \(DP\),所以 \(DP\) 的相关内容都是有的。一般来说,初始状态确定时可用顺推,终止状态确定时可用逆推,而期望大多是逆推的。
代码:
#include <cmath>
#include <queue>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100000 + 10;
double ex[maxn];
int n, m, head[maxn], in_deg[maxn], out_deg[maxn], sta[maxn], top, edge_num;
struct Edge { int v, w, nxt; } edge[maxn << 1];
inline void Add_edge(int u, int v, int w) {
edge[++edge_num].v = v, edge[edge_num].w = w, ++out_deg[u], ++in_deg[v];
edge[edge_num].nxt = head[u], head[u] = edge_num;
}
inline void Breath_fs(int s) {
queue<int> q; q.push(s);
while( !q.empty() ) {
sta[++top] = q.front(), q.pop();
for(int i = head[sta[top]]; i; i = edge[i].nxt)
if( --in_deg[edge[i].v] == 0 ) q.push(edge[i].v);
}
}
int main(int argc, char const *argv[])
{
scanf("%d%d", &n, &m);
for(int u, v, w, i = 1; i <= m; ++i)
scanf("%d%d%d", &u, &v, &w), Add_edge(u, v, w);
Breath_fs(1);
for(int t = n; t > 0; --t)
for(int x = sta[t], i = head[x]; i; i = edge[i].nxt)
ex[x] = ex[x] + (ex[edge[i].v] + edge[i].w) / out_deg[x];
printf("%.2lf\n", ex[1]);
return 0;
}
花影婆娑欲踏踩,悬崖樱树月色明。
[Luogu 4316] 绿豆蛙的归宿的更多相关文章
- Luogu P4316 绿豆蛙的归宿
P4316 绿豆蛙的归宿 题意翻译 「Poetize3」 题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边 ...
- [luogu]P4316 绿豆蛙的归宿(拓扑排序,期望)
P4316 绿豆蛙的归宿 题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够 ...
- 洛谷4316 绿豆蛙的归宿(DAG递推/概率dp)
题目大意: 给定一个DAG,求起点到终点的路径长度期望 根据题意可以知道每一条边都有一定概率被走到 那么\(\displaystyle\begin{aligned} Ans = \sum_{e \in ...
- 【BZOJ3036】绿豆蛙的归宿 拓补排序+概率
[BZOJ3036]绿豆蛙的归宿 Description 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度. ...
- BZOJ3036: 绿豆蛙的归宿&Wikioi2488:绿豆蛙的归宿
3036: 绿豆蛙的归宿 Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 108 Solved: 73[Submit][Status] Descript ...
- BZOJ 3036: 绿豆蛙的归宿( 期望dp )
从终点往起点倒推 . 在一个图 考虑点 u , 出度为 s : s = 0 , d[ u ] = 0 ; s ≠ 0 , 则 d( u ) = ( ∑ d( v ) ) / s ( ( u , v ) ...
- BZOJ3036绿豆蛙的归宿
BZOJ3036绿豆蛙的归宿 锲下陟凝 褰宓万 郝瓦痕膳 叶诙摞 А知π剧 椐猊∫距 屠缲佗 ゲ蕖揪 俜欧彖鹤 磲砩ほ #琛扶 觅电闸ス 捆鳢げ 浜窠 魂睨"烁 蕞滗浼 洒ヂ跪 ...
- [COGS 1065] 绿豆蛙的归宿
先贴题面w 1065. [Nescafe19] 绿豆蛙的归宿 ★ 输入文件:ldfrog.in 输出文件:ldfrog.out 简单对比时间限制:1 s 内存限制:128 MB 随着新 ...
- P4316 绿豆蛙的归宿(期望)
P4316 绿豆蛙的归宿 因为非要用bfs所以稍微麻烦一点qwq(大家用的都是dfs) 其实问题让我们求的就是经过每条边的概率*边权之和 我们可以用bfs把图遍历一遍处理概率,顺便把每条边的概率*边权 ...
随机推荐
- android使用百度地图最新sdk5.0后后代码混淆时,地图无法显示闪退问题
描述:刚开始遇到这个问题我一步一步去排除,最后发现在初始化地图的时候,代码混淆就有问题了, 问题描述:当跳显示地图的页面APP闪退, 解决对比: 1:对于老版本百度sdk:代码混淆时语句: -libr ...
- 工具资源系列之给虚拟机装个centos
前文我们已经讲解了如何在 mac 系统上安装虚拟机软件,这节我们接着讲解如何利用虚拟机安装 centos 镜像. 安装镜像的大致步骤基本相同,只不过是配置项略显不同而已,如果需要安装其他系统镜像,请参 ...
- 前端 聊聊Ajax
转载:关于Ajax的全面总结.
- Anaconda在Windows上安装不上原因
倒腾了一下午安装Anaconda,[所有程序]中只有一个Anaconda的目录,目录中只有一个anaconda prompt,最后发现是因为环境中原先就安装了Java环境,将之前安装的java环境卸载 ...
- 记录display:table的使用
兼容性:不兼容IE7 1.左右对齐 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- 【夯实shell基础】shell基础面面观
本文地址 点击关注微信公众号 wenyuqinghuai 分享提纲: 1. shell中的函数 2. shell中的数组 3. shell中的变量 4. shell中的运算符 5. Linux的一些命 ...
- 总结JAVA----IO流中的字节流
对于IO流中字节流的总结 字节流的概念 由于应用程序,经常需要和文件打交道,所以Inputstream专门提供了读写文件的子类:FileInputStream和FileOutputStream类,如果 ...
- jpa使用过程中出现问题记录[持续更新]
1.自定义JPQL语句,出现Not supported for DML operations 错误. 解决方案:在@Query注解上面加上@Modifying注解. //出现问题的代码 @Query( ...
- 移动端左右滑动问题-html与css解决
<!DOCTYPE html> <html> <head> <title>纯css实现左右滑动</title> <style type ...
- HTTP 1.1状态代码及其含义说明
100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分.(HTTP 1.1新) 101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协 ...