[Nowcoder]Portal
壹、题目描述 ¶
题目背景
小 W 所在的城市可以简化为 \(N\) 个地点,这些地点之间 \(M\) 条路相连,每条路有一定的长度,保证这些地点可以互相到达。 小W 此时先后接到了 \(K\) 个订单,第 \(i\) 个订单要求 小W 在 \(a_i\) 位置接货,并送达 \(b_i\) 位置。
然而事情并没有这么简单, 小W 呵呵一笑,掏出了一把传送枪,这把传送枪可以在 小W 所在位置放置传送门,假设 \(u\) 点和 \(v\) 点同时存在传送门,那么 小W 可以瞬间从 \(u\) 到达 \(v\) 。为了避免时空错乱,这把传送枪只能打开两个传送门,这意味着当 小W 想要打开第三扇传送门时,他必须关掉先前的某一扇传送门。
你需要注意以下几点:
- 传送门只能在原地放置,但是可以通过遥控关掉。
- 小 W 的小摩托一秒只能跑一个单位长度的距离。
- 小 W 很懒,所以他一次只会取一个货。
- “先来后到”, 小 W 一定会按照顺序完成他收到的订单。
最开始起点在 \(1\),问最少时间。
数据范围
\(1\leq u,v,a,b\leq n\) , \(0\leq w_i\leq 10^9\).
data | \(n\) | \(m\) | \(k\) | \(w\) |
---|---|---|---|---|
\(1\)~\(6\) | \(\leq20\) | \(\leq100\) | \(\leq20\) | \(\leq10\) |
\(7\)~\(14\) | \(\leq50\) | \(\leq1000\) | \(\leq50\) | \(\leq10^4\) |
\(15\)~\(20\) | \(\leq300\) | \(\leq40000\) | \(\leq300\) | \(\leq10^9\) |
贰、题解 ¶
- 其实就是问你 “从 \(1\) 开始,依次经过 \(a_1,b_1,a_2,b_2,\cdots a_k,b_k\) 的最小花费”;
- 先用 \(\rm Floyd\) 求出 \(dis(u,v)\),这是 \(\mathcal O(n^3)\) 的;
- 中间过程肯定是停留在关键点;
- 传送门在过程中显然只会保留一个门;
- 设状态 \(f(i,j)\) 表示当前在第 \(i\) 个关键点,传送门在 \(j\);
- 转移的时候特殊处理一下同一个关键点,传送门更改的情况(同层转移)就可以了;
- 时间复杂度 \(\mathcal O(n^3)\);
叁、参考代码 ¶
无码。