2020.04.04日常总结——分层图
-
所谓分层图,顾名思义,就是把一张图 成好几层,每一层都有属于自己层的特殊含义。
-
每层的图中的边权相同,表示从一个点到另一个点的边权。
-
分层图的核心是层间转移的代价的确定。一般而言,题目会给我们一些从一个点到另一个点的代价的“优惠”,而这些优惠,我们就通常让它作为层间边的边权。
-
最后一个需要注意的点的编号的确定。两种方法(记一层图有 个点和 条边):
- 第 层第 个点编号成 ,即二维的。
- 第 层第 个点编号成 ,即一维的。笔者就采用这种方法。
现在一个大陆上有 个城市, 条双向的道路。城市编号为 ,我们在 号城市,需要到 号城市,怎样才能最快地到达呢?
现在,我们一共有 张可以使时间变慢 的 SpellCard
,也就是说,在通过某条路径时,我们可以选择使用一张卡片,这样,我们通过这一条道路的时间就可以减少到原先的一半。需要注意的是:
- 在一条道路上最多只能使用一张
SpellCard
。 - 使用一张
SpellCard
只在一条道路上起作用。 - 你不必使用完所有的
SpellCard
。
对于 的数据:。
我们建 层的图(从第 层编号至第 层),第 层图表示使用了 张 SpellCard
。
考虑如何连边,对于一条边 (某层的 号点到该层的第 号点有一条边权为 的边),我们从每一层都连一条双向边 。
用 SpellCard
时如何连边呢?我们可以从每一层(记为第 层)向上一层(即第 层)连两条有向边 和 ,其中 表示上一层的 点。
建好图后,直接跑一般 dijkstra
算法即可。至于第一条规则,因为我们在一条边上走两遍(以上)肯定不优,所以第一条规则是无用的。
最后统计答案时,只需遍历每一层的第 号点,取其最小值即可。注意!不一定第 层是最优。可能出现最短路中边数不到 条的情况。此时,第 层的答案是反反复复走了某些边后得到的,反而比如其它层优!!!
一定注意点数和边数的问题。
想要四倍经验吗?Come on!!!