动态加层,动态加点
题目链接:poj 1895
题意:在公元3141年人类的足迹已经遍布银河系。为了穿越那巨大的距离,人类发明了一种名为超时空隧道的技术。超时空隧道是双向的,连接两个星系,穿越一次需要一天的时间。然而这个轨道只能同时给一艘飞船使用,也就是说,每条隧道每天只能有一艘飞船穿越。现在 I B M 公司要把 K 艘飞船从 S 运送到 T 。现在人类能够到达 N 个星系,拥有 M 条超时空隧道,请问至少需要几天才能将这些飞船开到目的地。
题解:感觉这个题非常的难,真心很难很恶心。首先从小到大枚举答案 a n s ,构造(a n s + 1)层的图,每层都是原图的 N 个点。源点连第一层的 S ,容量为 K ;所有层的 T 连向汇点,容量为 ﹢ ∞ 。对于原图中的无向边(U,V),从上一层的 U 、V 连向下一层 V 、U ,容量为 1 表示每天只能有一艘飞船飞过。那暂且停滞不能前行的飞船怎么办呢?我们再对于图中的每一个点 i 都向下一层的点 i 连边,容量为﹢ ∞,表示今天没有前行。求最大流,如果最大流等于 K ,那么我们当前枚举的 a n s 就是答案。不过这个题最难的显然是输出方案:从原点出发 D f s K次,得到 K 条路径。每次 D f s 时寻找一条从当前点出发有流的边走过去,并且把这条边的流减一,直到到达汇点。
我思故我在:通过这一道题我真的学会了如何动态加层,因为这一道题显然不能每次将图清空重新跑网络流,所以我们需要动态加层,每次再增广新的流量然后累计到原来的答案上。除此之外,在搜索方案的时候还要注意以下几点:如果从当前层的 i 走到了下一层的 i ,实际上是没有动的,因此这条边不能记录到方案里。如果相邻两层之间的(U,V)和(V,U)都有流,根据题目要求,一条路上不能有两个不同方向的流同时流过。但是这样的方案可以等效成两个流各自停留在 U 和 V 没有移动,而在后边的路程中两个流的路径进行了交换。