描述
【故事背景】
宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等。不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情。这些游戏往往
都有很多的支线剧情,现在JYY想花费最少的时间看完所有的支线剧情。
【问题描述】
JYY现在所玩的RPG游戏中,一共有N个剧情点,由1到N编号,第i个剧情点可以根据JYY的不同的选择,而经过不同的支线剧情,前往Ki种不同的新的剧情点。当然如果为0,则说明i号剧情点是游戏的一个结局了。
JYY观看一个支线剧情需要一定的时间。JYY一开始处在1号剧情点,也就是游戏的开始。显然任何一个剧情点都是从1号剧情点可达的。此外,随着游戏的进行,剧情是不可逆的。所以游戏保证从任意剧情点出发,都不能再回到这个剧情点。由于JYY过度使用修改器,导致游戏的“存档”和“读档”功能损坏了,
所以JYY要想回到之前的剧情点,唯一的方法就是退出当前游戏,并开始新的游戏,也就是回到1号剧情点。JYY可以在任何时刻退出游戏并重新开始。不断开始新的游戏重复观看已经看过的剧情是很痛苦,JYY希望花费最少的时间,看完所有不同的支线剧情。
分析
- 带有上下界的网络流
- 题目中“游戏保证从任意剧情点出发,都不能再回到这个剧情点”的条件保证这是一个拓扑图即DAG.
- 对于原图中的边x->y, 费用为cost, 这条边至少走一次, 而且每次时间都是相同的. 那么就可以起点->每个点(INF, 0), x->y(INF, cost), y->汇点(1, 0). 然后限制x->y的流量下限即可.
- 关于有流量下限的网络流问题, 一种比较直观的理解方式是如果x->y的容量为cap, 而下限为low, 那么让cap-low作为新的容量. 但是这时x和y的流量就不守恒了, 直白点说就是x流到y的流量也是x的祖先流到x的, 那么直接把low剪掉后x的祖先就不会把流量low流到x了. 这时流量就不守恒了. y丢失了部分流量, x的流量盈余了.
解决的方法是建立附加源和附加汇, 把这部分low的流量补给y再把x的流量low通过附加汇流走. 再在原汇和原源之间连容量为INF的边保持平衡. 把附加源和附加汇作为新的源汇跑最小费用最大流.
代码
https://code.csdn.net/snippets/623430
时间: 2024-10-14 05:06:31