Description

给定一张n个点,m条双向边的无向图。
你要从1号点走到n号点。当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点。
每当完成一次交易时,你可以选择直接使用那张票,也可以选择扔掉那张票然后再花1元钱随机买另一张票。注意你可以无限次扔票。
请使用最佳的策略,使得期望花的钱数最少。

Input

第一行包含两个正整数n,m(1<=n,m<=300000),表示点数和边数。
接下来m行,每行两个正整数u,v(1<=u,v<=n),表示一条双向边。
输入数据保证无重边、无自环,且1号点一定可以走到n号点。

Output

输出一行一个实数,即最少的期望花费,当绝对或者相对误差不超过10^{-6}时视为正确。

Sample Input

5 8
1 2
1 3
1 4
2 3
2 4
3 5
5 4
2 5

Sample Output

4.1111111111

Solution

最优策略的话,一个点只会走向到终点期望步数比他小的点,用最短路来更新$DP$就可以了。

反正我也说不太明白,感性理解一下吧。

Code

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<queue>
 5 #define N (300009)
 6 #define pi pair<double,int>
 7 using namespace std;
 8
 9 struct Edge{int to,next;}edge[N<<1];
10 int n,m,u,v,deg[N],c[N],vis[N];
11 int head[N],num_edge;
12 double s[N],f[N];
13 priority_queue<pi,vector<pi>,greater<pi> >q;
14
15 void add(int u,int v)
16 {
17     deg[v]++;
18     edge[++num_edge].to=v;
19     edge[num_edge].next=head[u];
20     head[u]=num_edge;
21 }
22
23 int main()
24 {
25     scanf("%d%d",&n,&m);
26     for (int i=1; i<=m; ++i)
27         scanf("%d%d",&u,&v), add(u,v), add(v,u);
28     q.push(pi(0,n));
29     while (!q.empty())
30     {
31         int x=q.top().second; q.pop();
32         if (vis[x]) continue; vis[x]=1;
33         for (int i=head[x]; i; i=edge[i].next)
34         {
35             int y=edge[i].to;
36             if (vis[y]) continue;
37             c[y]++; s[y]+=f[x]; f[y]=(s[y]+deg[y])/c[y];
38             q.push(pi(f[y],y));
39         }
40     }
41     printf("%.10lf\n",f[1]);
42 }

转载于:https://www.cnblogs.com/refun/p/10628626.html

BZOJ5197:[CERC2017]Gambling Guide(最短路,期望DP)相关推荐

  1. [BZOJ5197] [CERC2017]Gambling Guide

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

  2. bzoj5197:[CERC2017]Gambling Guide

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

  3. luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...

  4. 【BZOJ5197】Gambling Guide (最短路,期望)

    [BZOJ5197]Gambling Guide (最短路,期望) 题面 BZOJ权限题 洛谷 题解 假设我们求出了每个点的期望,那么对于一个点,只有向期望更小的点移动的时候才会更新答案. 即转移是: ...

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

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

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

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

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

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

  8. CERC2017 Gambling Guide

    一个在邻国的铁路系统是由nn个城市(编号从11到nn),和mm条连接两个不同城市的双向铁路组成的.铁路票只能在安装在每个城市的自动售票机购买.不幸的是,黑客们已经篡改了这些售票机,现在它们有下面的规则 ...

  9. 插头DP 概率DP / 期望DP

    插头DP && 概率DP / 期望DP 写在前面: 插头DP P5056 [模板]插头dp 手写哈希表的方法: 拉链法的代码如下: 开放寻址法的代码如下: 接下来是这道题的代码实现: ...

最新文章

  1. python内建作用域_为什么 Python 的类不构成作用域(scope)?
  2. 两个div叠加触发事件发生闪烁问题
  3. Informix IDS 11体系打点(918考试)认证指南,第 5 局部: 数据库管事器操作(4)
  4. FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS
  5. cookie中JSESSIONID的由来
  6. java.lang.IllegalArgumentException: Request header is too large 解决方案
  7. Redis学习---(3)Redis 配置
  8. join left semi_Hive的left join、left outer join和left semi join三者的区别
  9. 栈和递归---手动实现一个栈和蒜头君吃桃
  10. 剑指offer——面试题41:和为S的连续整数序列
  11. 自动操作: mac新建文本文档
  12. java中char占几bits_char类型占几个字节
  13. Anaconda下载(Windows系统)
  14. EditText属性详情
  15. XP教育网用户免费上网
  16. Android 复杂的列表视图新写法 MultiType
  17. 注册Heroku账户
  18. Centos 7 内网安装 DzzOffice
  19. 在鹅厂如何带薪刷视频?
  20. 凝思操作系统:U盘无法识别和读取问题

热门文章

  1. 错误提示:“ReferenceError: require is not defined in ES module scope, you can use impor”解决方法
  2. 邬建国在2008内蒙古大学毕业典礼上的讲话
  3. 如何判断app在前台还是后台
  4. iphone微信小程序底部预留bar安全距离css
  5. 微信小程序 腾讯地图逆地址解析reverseGeocoder之poi_options
  6. 别用Docker了,这7大开源容器化工具也能满足你!
  7. 在线图书销售系统顺序图_myON电子图书馆最全介绍
  8. 北斗再入试题,北京中考物理实验【探究题】占比过半 方格教育
  9. 金茂服务通过聆讯:9个月营收超10亿 中化与平安人寿是股东
  10. 手动安装torch和torchviosn教程