这是一道经典的有向无环图(DAGDAGDAG)上的多源点汇点流/时间扩展问题。
问题分析
我们需要找到kkk个人从节点 1 到节点nnn的最晚到达时间的最小值。每个人必须沿着边走,且每条边每个时刻只能有一个人经过。
由于图是DAGDAGDAG,且边的容量为 1(每个时刻),这实际上是一个最小费用最大流问题,或者是二分图匹配问题。
我们可以将问题转化为:
每个人必须从1到nnn。
每条边 (u,vu,vu,v) 在每个时刻ttt只能被一个人占用。
求所有人到达nnn的最大时间的最小值。
关键观察
1.
DAGDAGDAG上的路径:每个人从1到nnn的路径长度(边数)是固定的,但具体路径可以不同。
2.
边的容量:每条边每个时刻只能被一个人使用。这意味着如果两个人同时到达某个节点,他们不能同时通过同一条出边。
3.
时间扩展:我们可以将每个节点vvv复制成多个时间点(v,tv, tv,t),表示在时刻ttt位于节点vvv。边 (u,vu,vu,v) 在时间 ttt被使用,对应从 (u,tu, tu,t) 到 (v,t+1v, t+1v,t+1) 的边。
代码: