P3232 [HNOI2013]游走

Description\text{Description}Description

给定一个 nnn 个点 mmm 条边的无向连通图。从 111 号节点出发,每一步以相等的概率 随机 选择当前节点连出去的某条边,经过这条边走到下一个节点,获得等于这条边的编号的分数。到达 nnn 号顶点时结束。请对这 mmm 条边进行编号,使得获得的总分的期望值 最小

Solution\text{Solution}Solution

考虑 dp\rm dpdp,设 fuf_ufu​ 表示到达节点 uuu 的期望次数,gig_igi​ 表示经过边 iii 的期望次数,dud_udu​ 表示节点 uuu 的度数。

对于图中的一条边 (u,v)(u,v)(u,v),vvv 连出去 dvd_vdv​ 条边,只有一种情况会经过 (u,v)(u,v)(u,v),所以有 fvdv\dfrac{f_v}{d_v}dv​fv​​ 种。

还要注意:

  • 由于到 nnn 号点就停了,因此 nnn 号点对答案没有贡献,因此 u,vu,vu,v 都不能为 nnn。
  • 一开始就在一号点,所以 f1f_1f1​ 初始值为 111。

所以有
fu={∑(u,v)∈E,v≠nfvdv+1u=1∑(u,v)∈E,v≠nfvdvu≠1,u≠nf_u= \begin{cases} \sum\limits_{(u,v)\in E,v\ne n}\dfrac{f_v}{d_v}+1&u=1\\ \sum\limits_{(u,v)\in E,v\ne n}\dfrac{f_v}{d_v}&u\ne1,u\ne n \end{cases} fu​=⎩⎪⎪⎨⎪⎪⎧​(u,v)∈E,v​=n∑​dv​fv​​+1(u,v)∈E,v​=n∑​dv​fv​​​u=1u​=1,u​=n​
对于边 (u,v)(u,v)(u,v),有可能是从 uuu 过来的,也有可能是从 vvv 过来的。


g(u,v)=fudu+fvdvu≠n,v≠ng_{(u,v)}=\dfrac{f_u}{d_u}+\dfrac{f_v}{d_v}\quad u\ne n,v\ne n g(u,v)​=du​fu​​+dv​fv​​u​=n,v​=n
然后将 ggg 进行排序,贪心地选择即可。

但是我们发现一个问题,fvf_vfv​ 可以推到 fuf_ufu​,而更新后的 fuf_ufu​ 又能推到 fvf_vfv​,这样就没法处理了。我们把这种问题称为 有后效性 dp\rm dpdp

怎么处理呢?

我们举个例子,假设是这样一张图:

除 555 号点之外:
{f1=f2d2+f3d3+1f2=f1d1+f4d4f3=f1d1f4=f2d2\begin{cases} f_1=\dfrac{f_2}{d_2}+\dfrac{f_3}{d_3}+1\\ f_2=\dfrac{f_1}{d_1}+\dfrac{f_4}{d_4}\\ f_3=\dfrac{f_1}{d_1}\\ f_4=\dfrac{f_2}{d_2} \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧​f1​=d2​f2​​+d3​f3​​+1f2​=d1​f1​​+d4​f4​​f3​=d1​f1​​f4​=d2​f2​​​
我们整理一下这个方程组:
{1⋅f1−1d2⋅f2−1d3⋅f3+0⋅f4=1−1d1⋅f1+1⋅f2+0⋅f3−1d4⋅f4=0−1d1⋅f1+0⋅f2+1⋅f3+0⋅f4=00⋅f1−1d2⋅f2+0⋅f3+1⋅f4=0\begin{cases} 1\cdot f_1-\dfrac{1}{d_2}\cdot f_2-\dfrac{1}{d_3}\cdot f_3+0\cdot f_4=1\\ -\dfrac{1}{d_1}\cdot f_1+1\cdot f_2+0\cdot f_3-\dfrac{1}{d_4}\cdot f_4=0\\ -\dfrac{1}{d_1}\cdot f_1+0\cdot f_2+1\cdot f_3+0\cdot f_4=0\\ 0\cdot f_1-\dfrac{1}{d_2}\cdot f_2+0\cdot f_3+1\cdot f_4=0 \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧​1⋅f1​−d2​1​⋅f2​−d3​1​⋅f3​+0⋅f4​=1−d1​1​⋅f1​+1⋅f2​+0⋅f3​−d4​1​⋅f4​=0−d1​1​⋅f1​+0⋅f2​+1⋅f3​+0⋅f4​=00⋅f1​−d2​1​⋅f2​+0⋅f3​+1⋅f4​=0​
这就是一个 (n−1)(n-1)(n−1) 元一次方程组,高斯(-约旦)消元即可。

时间复杂度 O(n3)\mathcal{O}(n^3)O(n3)。

Code\text{Code}Code

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
typedef double db;
using namespace std;const int MAXN = 505;
const int MAXM = 125005;int cnt;
int head[MAXN], st[MAXM], ed[MAXM], d[MAXN];struct edge
{int to, nxt;
}e[MAXM << 1];void add(int u, int v)
{e[++cnt] = edge{v, head[u]};head[u] = cnt;d[u]++;
}int n, m;
db a[MAXN][MAXN];
db f[MAXN], g[MAXM];void Gauss_Jordan()
{for (int i = 1; i <= n; i++){int mx = i;for (int j = i + 1; j <= n; j++){if (fabs(a[j][i]) > fabs(a[mx][i])){mx = j;}}if (mx != i){swap(a[i], a[mx]);}for (int j = 1; j <= n; j++){if (j != i){db val = a[j][i] / a[i][i];for (int k = i + 1; k <= n + 1; k++){a[j][k] -= a[i][k] * val;}}}}for (int i = 1; i <= n; i++){f[i] = a[i][n + 1] / a[i][i];}
}bool cmp(double x, double y)
{return x > y;
}int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= m; i++){scanf("%d%d", st + i, ed + i);add(st[i], ed[i]);add(ed[i], st[i]);}n--;for (int u = 1; u <= n; u++){a[u][u] = 1;for (int i = head[u]; i; i = e[i].nxt){int v = e[i].to;if (v != n + 1){a[u][v] = -1.0 / d[v];}}if (u == 1){a[u][n + 1] = 1;}}Gauss_Jordan();for (int i = 1; i <= m; i++){g[i] = f[st[i]] / d[st[i]] + f[ed[i]] / d[ed[i]];}sort(g + 1, g + m + 1, cmp);db ans = 0;for (int i = 1; i <= m; i++){ans += i * g[i];}printf("%.3lf\n", ans);return 0;
}

练习:CF24D Broken robot

【动态规划】有后效性 DP相关推荐

  1. Cogs 376. [IOI2002]任务安排(后效性DP)

    [IOI2002]任务安排 ★☆ 输入文件:batch.in 输出文件:batch.out 简单对比 时间限制:1 s 内存限制:128 MB N个任务排成一个序列在一台机器上等待完成(顺序不得改变) ...

  2. 0x55. 动态规划 - 环形与后效性处理(例题详解 × 6)

    目录 0x55.1 环形结构上的动态规划问题 两次DP法 Problem A. Naptime 破环成链法 Problem B. 环路运输 Problem C. Two Rabbits 0x55.2 ...

  3. poj 2228 Naptime(DP的后效性处理)

    \(Naptime\) 描述 Goneril是一只睡眠不足的母牛.她的一天被划分为N(3 <= N <= 3,830)相等的时间段,但她只能在床上花费B(2 <= B <N)不 ...

  4. 【NOI2019】回家路线【无后效性dp状态设计】【斜率优化】

    传送门 题意:给定MMM个班车,每个班车pip_ipi​时刻从xix_ixi​发车qiq_iqi​到达yiy_iyi​,等车ttt时间花费代价At2+Bt+CAt^2+Bt+CAt2+Bt+C,在tt ...

  5. bzoj3875: [Ahoi2014Jsoi2014]骑士游戏 spfa处理有后效性动规

    bzoj3875: [Ahoi2014&Jsoi2014]骑士游戏 Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的 ...

  6. 【BZOJ3875】【Ahoi2014】骑士游戏 SPFA处理有后效性动规

    Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,JY ...

  7. 有后效性和无后效性的通俗理解

    无后效性是动态规划算法及贪心算法的前提条件 无后效性:某阶段的状态一旦确定,则此后过程的决策不再受此前各种状态及决策的影响. 有后效性:就是某个状态之后要做的决策会受之前的状态及决策的影响. 举例:如 ...

  8. 【动态规划】状压dp:蓝桥2020补给(旅行商问题)

    问题可以转换为: 从0出发途径每个城市至少一次返回0求最短路径: 解法:动态规划(状压dp)+Floyd预处理最短路径(从一个城市到另一个城市走最短路即可,不需考虑途径什么城市) [动态规划笔记]状压 ...

  9. DP动态规划-爬塔(双层dp)

    DP动态规划-爬塔(双层dp) 比赛来源:牛客 - 中国计量大学现代科技学院第四届"中竞杯"程序设计校赛 题目--------F题 description: 高川最喜欢的游戏当属 ...

最新文章

  1. 【 Linux 】安装、配置并用 Vim 编写第一个 C 程序
  2. js 数组,字符串,JSON,bind, Name
  3. 003_隐藏和显示效果
  4. 查看数据库、表、索引的物理存储情况
  5. 计算机控制系统第三次作业,计算机组成与系统结构第三次作业
  6. Flutter 下拉刷新花式玩法
  7. 异步实现,查询大量数据时的加载
  8. 利用helloworld来检测VPS的对外端口是否打开
  9. printf的两个需要注意的问题:无符号整数和64位整数
  10. 2912: 奇怪的加法问题(XOR的加法写法)
  11. ​技术沙龙 | 移动云Teatalk(西安站)带你走进云网融合
  12. 问题六十八:着色模型(shading model)(2)——光照模型(Light model)
  13. iOS底层探索之对象的本质和类的关联特性initIsa(下)
  14. dell服务器怎么用u盘系统安装win7系统教程,戴尔DellU盘重装系统操作教程
  15. 无参考图像质量评价——漏勺模型
  16. 精益研发管理-培训感想
  17. 华为MAC-VLAN举例
  18. PLS-00907: cannot load library unit
  19. mysql+系统数据库+修复_如何进行mysql表的修复工作?
  20. html+js彩票预选页面

热门文章

  1. 英语发音规则---B字母
  2. Win10 更改桌面背景为图片不生效,马上自动变为纯色黑色
  3. 新知实验室 腾讯云实时音视频产品体验
  4. 传递关系的复合不一定是传递的
  5. 【您的凭据不工作】win7远程桌面提示,请输入新凭据。登录没有成功
  6. GBT22239-2019等保2.0三级要求
  7. Excel学习日记:L23-如何计算成绩排名
  8. android入门书籍!微信小程序趋势及前景,安卓系列学习进阶视频
  9. php mpm,ubuntu切换为apache+php-fpm+mpm_event
  10. linux用独显运行steam,Steam使数以千计的Windows游戏可以在Linux上轻松玩