luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)
整理的算法模板合集: ACM模板
点我看算法全家桶系列!!!
实际上是一个全新的精炼模板整合计划
P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)
Weblink
https://www.luogu.com.cn/problem/P4745
Problem
Solution
显然考虑期望 dpdpdp 。因为只有一个终点 nnn,且状态已知,考虑逆推。
设 f[x]f[x]f[x] 表示点 xxx 到 nnn 的期望花费,或者可以说是从 nnn 到点 xxx 的期望花费。 d[x]d[x]d[x] 表示 xxx 点的度数,则有
f[x]=∑min{f[x],f[y]}d[x]+1\displaystyle f[x]=\frac{ \sum \min \{ f[x],f[y] \} }{d[x]}+1f[x]=d[x]∑min{f[x],f[y]}+1
即,花费一枚硬币,选择原地不动,或者从 yyy 走到 xxx ,到达点 xxx 一共有 d[x]d[x]d[x] 条路,即一共有 d[x]d[x]d[x] 种情况,所以概率期望就是1d[x]\cfrac{1}{d[x]}d[x]1,花费的期望就为 总花费乘上 1d[x]\cfrac{1}{d[x]}d[x]1。
观察公式显然可以发现对于一个点 xxx ,所有与 xxx 相邻的点 yyy,能对 xxx 产生贡献,当且仅当 f[y]<f[x]f[y]<f[x]f[y]<f[x] 。
假设对于点 xxx 而言,满足上述条件(f[y]<f[x]f[y]<f[x]f[y]<f[x])的相邻点 yyy 点一共有 cnt[x]cnt[x]cnt[x] 个,则有
f[x]=(d[x]−cnt[x])×f[x]+∑f[y]+cnt[x]d[x]f[x]=∑f[y]+d[x]cnt[x]\begin{aligned} & \displaystyle f[x]= \frac{ (d[x]-cnt[x]) \times f[x] + \sum f[y]+cnt[x]}{d[x]} &\\& \displaystyle f[x]= \frac{\sum f[y] + d[x] }{cnt[x]} \end{aligned}f[x]=d[x](d[x]−cnt[x])×f[x]+∑f[y]+cnt[x]f[x]=cnt[x]∑f[y]+d[x]
显然 ∑f[y]\sum f[y]∑f[y] 可以直接把所有小于 f[x]f[x]f[x] 的都加起来,可以用最短路去实现,因为我们每次从队里拿出来的一定是最小的 f[y]f[y]f[y],那么所有与他相邻的点都可以被他更新,我们就可以对于每一个 xxx 能到达的点 yyy ,求和,即 sum[y]=∑f[x]sum[y]=\sum f[x]sum[y]=∑f[x]。然后对于每一个点 yyy ,直接根据公式更新 f[y]f[y]f[y] 即可。
更新的时候,是从 nnn 出发,走到 111 ,即每次从 xxx 走到 yyy ,那么公式中的 xxx 就是 yyy ,也就是用所有 的 xxx 去更新 yyy,每次更新的是 f[y]f[y]f[y] 而不是公式里的 f[x]f[x]f[x]。
Code
int n, m, t;
int head[N], ver[M], edge[M], tot, nex[N];
double d[N], cnt[N], sum[N];
double dist[N];
bool vis[N];void add(itn x, int y)
{ver[tot] = y;nex[tot] = head[x];head[x] = tot ++ ;
}void dijkstra()
{memset(dist, 0x3f, sizeof dist);dist[n] = 0;priority_queue<PDI, vector<PDI>, greater<PDI> > q;q.push({0.0, n});while(q.size()) {itn x = q.top().second;q.pop();if(vis[x]) continue;vis[x] = 1;for(int i = head[x]; ~i; i = nex[i]) {itn y = ver[i];if(vis[y]) continue;cnt[y] ++ ;sum[y] += dist[x];dist[y] = (d[y] + sum[y]) / cnt[y];q.push({dist[y], y});}}
}int main()
{memset(head, -1, sizeof head);scanf("%d%d", &n, &m);for(int i = 1; i <= m; ++ i) {itn x, y;scanf("%d%d", &x, &y);add(x, y);add(y, x);d[x] ++ ;d[y] ++ ;}dijkstra();printf("%.8f\n", dist[1]);return 0;
}
luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)相关推荐
- 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra
题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...
- Luogu4745/Gym101620G CERC2017 Gambling Guide 期望、DP、最短路
传送门--Luogu 传送门--Vjudge 设\(f_x\)为从\(x\)走到\(N\)的期望步数 如果没有可以不动的限制,就是隔壁HNOI2013 游走 如果有可以不动的限制,那么\(f_x = ...
- [BZOJ5197] [CERC2017]Gambling Guide
[BZOJ5197] [CERC2017]Gambling Guide 题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5197 Solut ...
- CERC2017 Gambling Guide,最短路变形,期望dp
题目链接 题面链接 题意 给定一个无向图,你需要从111点出发到达n" role="presentation" style="position: relativ ...
- BZOJ5197:[CERC2017]Gambling Guide(最短路,期望DP)
Description 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易 ...
- 2021牛客暑期多校训练营6 :D Gambling Monster 期望dp + fwt + cdq分治
传送门 文章目录 题意: 思路: 题意: 给你一个大轮盘,被分成了nnn个区域0,1,2,..,n−10,1,2,..,n-10,1,2,..,n−1,每个区域被转到的概率是ai∑j=0n−1aj\f ...
- Luogu P3830 [SHOI2012]随机树 | 期望 DP
题目链接 第$1$问 设$g(i)$为当有$i$个叶节点时,树的叶节点的平均深度的期望值. 假如现在有$(i-1)$个叶节点,现在要等概率地展开一个叶节点,那么展开的那个叶节点的期望深度为$g(i-1 ...
- Luogu P1850换教室【期望dp】By cellur925
题目传送门 首先这个题我们一看它就是和概率期望有关,而大多数时候在OI中遇到他们时,都是与dp相关的. \(Vergil\)学长表示,作为\(NOIp2016\)的当事人,他们考前奶联赛一定不会考概率 ...
- bzoj5197:[CERC2017]Gambling Guide
传送门 好像概率期望也写过一些题了,但是没啥用,还是不会套路,看了题解才会写 首先设\(f[x]\)为\(x\)到\(n\)的期望最少步数,\(deg_x\)表示\(x\)的度数 不考虑不动,显然\( ...
最新文章
- mysql基于.frm和.ibd进行mysql数据恢复
- 关于maven依赖中的scopeprovided/scope使用
- python标签使用教程_怎样用Python做标签云
- ntrip获取源列表_Ntrip协议简介(转)
- 机器学习笔记(十)——Logistic Function AND Softmax Function
- LSTM 与 Bilstm介绍(包含代码实现、Python)
- [Windows Server 2012] 安装PHP+MySQL方法
- nginx关闭websocket
- python输入一个三位数、输出它的逆序数值_c语言 从键盘输入一个三位数,输出该数的逆序数。...
- 如何破解无线网密码进行上网
- 解决pdf.js下载PDF文件名称中文乱码和不带.pdf后缀名问题
- jungle scout插件版 v5.7.1官方版
- 树莓派4b 3.5inch显示屏+远程+FTP+建站
- 电信获取光猫超级密码
- CAD转图片用什么软件?分享两种途径
- 聊聊数据库~5.SQL运维上篇
- matlab pdepe函数边界,科学网-使用MATLAB中pdepe函数求解一维偏微分方程-邓浩鑫的博文...
- 关于陌陌和微信表情页与输入法之间切换的问题
- android打开手电筒代码,Android 通用型手电筒代码
- 算一下你来到这个世界多少天?