题目思路存储

奇怪的最短路问题

原题:HDU6166/P5304/LOJ#3087

法一

维护最短路和次短路以及它们的来源点。具体有待补充。

法二

一种套路:多源多汇最短路。

多源多汇怎么做?

建一个超级源点和超级汇点,但是这样从源点出来就可以0权到汇点。

解决方案:

  1. 随机划分:

    $p=\frac{1}{4}$,T次成功概率:$1-(1-p)^T$,虽然 $20$ 次随机成功概率为 $99.68\%$,但毕竟是概率,不够靠谱并且基于RP。

  2. 二进制分组:

    按照二进制的一个位置上的 $01$ 值来划分谁是源点谁是汇点,由数据范围知最多 $17$ 次划分,每次需要跑两遍。有点卡时限但能过。

指针分析

复习指针?

题目中给的关系实际上是一些边的关系,但是这些边有些限制。

某些边有激活条件,例如一个指针得先指向某个地址之后才能访问。

  1. 小模拟,将题目操作转化为代码。

  2. Bellman-ford 思想:不断松弛,在过程中实现 $4$ 种操作并同时维护。

    1. 实现思路1:set 维护每个点能到哪些点

    2. 实现思路2:状态压缩

  3. 关于优化:

    1. 基于RP:减少松弛轮数

    2. 基于卡常:快读

    3. 基于随机化:shuffle+clock() 卡时间

老算法焕发新生。

果国的奇妙旅行

带决策的期望。

#define 卡 票

定义 $E(u)$ 表示 $u$ 到终点的期望。

此题目要求在最优策略下到终点的期望抽卡次数,可以发现所谓最优策略就是贪心:如果我抽到的卡走过去的期望 $E(v)$ 较 $E(u)$ 而言减小了,即 $E(u) > E(v)$,那么我们就可以走到 $v$,定义这就是一次成功的决策

也就是说,如果我抽到的卡能使我的期望减小,那么就走,否则扔掉重来。于是我们的转移就可以分为两种情况:一种是 $v$ 向 $u$ 转移;另一种是不转移。

我们又发现,从结果来看,如果 $u$ 走到 $v$ 这个决策是成功的,那么 $v$ 走到 $u$ 的决策一定是不成功的,因为 $E(u) > E(v)$,就一定 $E(u) > E(v)$ (满篇废话,然而这种显著的废话往往是最难发现并利用的)。

综上,我们就认为 $u$ 的转移是有方向的。

根据以上的情况讨论,不难得到 $E(u)$ 转移如下:

$$E(u)=\sum_{v\in e(u)}^{E(v) < E(u)}{\frac{E(v)}{deg(u)}}+\sum_{v\in e(u)}^{E(v)\geq E(u)}{\frac{E(u)}{deg(u)}}+1$$

设 $x=\sum[v\in e(u) \And E(v) \geq E(u)],d=deg(u)$

化简过程:

$$E(u)=\frac{1}{d}(\sum_{v\in e(u)}^{E(v) < E(u)}{E(v)}+xE(u))+1$$

$$dE(u)=\sum_{v\in e(u)}^{E(v) < E(u)}{E(v)}+xE(u)+d$$

$$(d-x)E(u)=\sum_{v\in e(u)}^{E(v) < E(u)}{E(v)}+d$$

得到:

$$E(u)=\sum_{v\in e(u)}^{E(v) < E(u)}{\frac{E(v)}{d-x}}+\frac{d}{d-x}$$

十分抽象的一点是:我确定边的方向需要 $u$ 和 $v$ 的期望来进行大小比较,然而期望又需要边的方向来更新。问题就是如何打破这个循环。

数学上的推导不太可能了,考虑从更新顺序入手。

目前这里的方法是填表法,考虑使用刷表法,即对于每个 $u$ 去更新它的 $v$。考虑使用Dijkstra算法。而且不难发现,$E(u)$ 的值随着更新不断减小(分母变大)。

像这种破逻辑的环很难解决,切入口不好找,因此这里直接放结论。

一开始设置 $E(u)=+\infty$ ,然后让 $E(v)$ 从小到大更新 $E(u)$ 。

(为什么这样可行我也不会证。可能需要数学归纳法。)

最后,因为 $E(u)$ 的定义是 $u$ 到终点的期望,因此搜索时应该从终点开始搜。(思考:从起点搜结果会受影响吗?)

推完了。

至于怎么实现还得是Dijkstra。

事实上,指针分析 和 果国的奇妙旅行 都不是最短路的题目,但是借用了最短路算法的思想,不愧为《最新颖的一集》。

作者

LynxCat

发布于

2023-12-30

更新于

2024-01-09

许可协议

评论