这是一道经典的有向无环图(DAGDAGDAG)路径覆盖问题。由于剧情不可逆(DAGDAGDAG),且每次重新开始游戏等价于选择一条从 1 出发的路径,我们需要用若干条路径覆盖所有边,最小化总时间(路径长度之和)。
思路:最小费用最大流
关键观察:每条边必须被恰好经过一次。重新开始游戏意味着路径之间可以"拼接"——如果一条路径在节点vvv结束,另一条可以从vvv开始,这样就能省下重复走前缀的时间。
建模:
1.
拆点:将每个节点iii拆成入点iini_{in}iin 和出点iouti_{out}iout ,连边(iin→iout)(i_{in} \to i_{out})(iin →iout ),容量+∞+\infty+∞,费用000。
2.
原图边:对于原图中的每条有向边(u→v,w)(u \to v, w)(u→v,w),连边(uout→vin)(u_{out} \to v_{in})(uout →vin ),容量 1,费用www。
3.
源汇:源点 S 连向1out1_{out}1out (容量 +∞+\infty+∞,费用 0);所有节点的iini_{in}iin 连
求最小费用最大流。此时:
每条原图边恰好被流过一次(容量为 1,必须满流才能覆盖所有边)。
节点拆分边允许流量"穿过"节点,实现路径的拼接(即不重新开始游戏)。
总费用就是所有被经过边的权值之和,即最少时间。
答案:求出的最小费用值。
C++代码: