整理的算法模板合集: 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 + 最短路实现)相关推荐

  1. 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra

    题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...

  2. Luogu4745/Gym101620G CERC2017 Gambling Guide 期望、DP、最短路

    传送门--Luogu 传送门--Vjudge 设\(f_x\)为从\(x\)走到\(N\)的期望步数 如果没有可以不动的限制,就是隔壁HNOI2013 游走 如果有可以不动的限制,那么\(f_x = ...

  3. [BZOJ5197] [CERC2017]Gambling Guide

    [BZOJ5197] [CERC2017]Gambling Guide 题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5197 Solut ...

  4. CERC2017 Gambling Guide,最短路变形,期望dp

    题目链接 题面链接 题意 给定一个无向图,你需要从111点出发到达n" role="presentation" style="position: relativ ...

  5. BZOJ5197:[CERC2017]Gambling Guide(最短路,期望DP)

    Description 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易 ...

  6. 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 ...

  7. Luogu P3830 [SHOI2012]随机树 | 期望 DP

    题目链接 第$1$问 设$g(i)$为当有$i$个叶节点时,树的叶节点的平均深度的期望值. 假如现在有$(i-1)$个叶节点,现在要等概率地展开一个叶节点,那么展开的那个叶节点的期望深度为$g(i-1 ...

  8. Luogu P1850换教室【期望dp】By cellur925

    题目传送门 首先这个题我们一看它就是和概率期望有关,而大多数时候在OI中遇到他们时,都是与dp相关的. \(Vergil\)学长表示,作为\(NOIp2016\)的当事人,他们考前奶联赛一定不会考概率 ...

  9. bzoj5197:[CERC2017]Gambling Guide

    传送门 好像概率期望也写过一些题了,但是没啥用,还是不会套路,看了题解才会写 首先设\(f[x]\)为\(x\)到\(n\)的期望最少步数,\(deg_x\)表示\(x\)的度数 不考虑不动,显然\( ...

最新文章

  1. mysql基于.frm和.ibd进行mysql数据恢复
  2. 关于maven依赖中的scopeprovided/scope使用
  3. python标签使用教程_怎样用Python做标签云
  4. ntrip获取源列表_Ntrip协议简介(转)
  5. 机器学习笔记(十)——Logistic Function AND Softmax Function
  6. LSTM 与 Bilstm介绍(包含代码实现、Python)
  7. [Windows Server 2012] 安装PHP+MySQL方法
  8. nginx关闭websocket
  9. python输入一个三位数、输出它的逆序数值_c语言 从键盘输入一个三位数,输出该数的逆序数。...
  10. 如何破解无线网密码进行上网
  11. 解决pdf.js下载PDF文件名称中文乱码和不带.pdf后缀名问题
  12. jungle scout插件版 v5.7.1官方版
  13. 树莓派4b 3.5inch显示屏+远程+FTP+建站
  14. 电信获取光猫超级密码
  15. CAD转图片用什么软件?分享两种途径
  16. 聊聊数据库~5.SQL运维上篇
  17. matlab pdepe函数边界,科学网-使用MATLAB中pdepe函数求解一维偏微分方程-邓浩鑫的博文...
  18. 关于陌陌和微信表情页与输入法之间切换的问题
  19. android打开手电筒代码,Android 通用型手电筒代码
  20. 算一下你来到这个世界多少天?

热门文章

  1. 写 Python 代码不可不知的函数式编程技术
  2. windows10+虚拟机Ubuntu17.10+Anaconda+Python2
  3. linux的那些破事
  4. 大数据实验室(大数据基础培训)——基础概念
  5. 分享一个C#读取计算机信息的类
  6. 状态机在计算机中的应用
  7. 20分钟一键自动化部署10台集群规模实战(隆重分享)
  8. C++之头文件与源文件
  9. 对10个整数按由大到小顺序排序
  10. 电脑用久了,学会这几招增加十年寿命,清除电脑里的垃圾方法与流氓软件工具