显然能够二分。
check 答案是否
≥1 显然不弱于最小割,所以本题明显需要使用网络流。
具体地,我们使用一个常用的建图技巧,并求其最小割:对于一个点
di,j,其与
S 连通等价于
disi≥j,通过建立
(di,p,di,p+1,1) 来强制必须断且仅断一条
i 链上的点(特别地,需要连接
(S,di,0,+∞))。
在此基础上,我们可以添加一些限制,形如“如果
disi≥p,那么
disj≥q”。
其建边形式为
(di,p,dj,q,+∞)。如果
disi≤p 并且
disj>q,那么
di,p 与
S 连通,
dj,q 与
T 连通,不符合是一个割的定义。你也可以使用边权的代价来废除本限制。
在本题中,如果存在一条边
(u,v),那么显然有
disv≤disu+1。也就是说对于每一个
p,有如果
p≤disv,那么
p≤disv≤disu+1,即
p−1≤disu。所以可以建立
(dv,p,du,p−1,+∞)。
当
(u,v) 边权明确为
0 时,就有
disv≤disu。如果
p≤disv,那么
p≤disu。所以可以建立从
dv,p 到
du,p 的边。但是你可以花费
1 的代价来撤销本限制,所以边权为
1,即需要建立
(dv,p,du,p,1) 的边。显然对于同一条
(u,v),一种赋权方案中其引出的边最多只会违反一个,所以最优解中这类边只会割去一个。
一个补丁就是你必须让
dis1=0,disn=mid。直接固定割掉
(d1,0,d1,1) 以及
(dn,mid,T) 即可。
在一次判定中,我们只需要看割是否
≤K+n−2(
n−2 是为除
1,n 之外每一个点选择一个最短路的固定开销),而一共建立了
nm 条边,所以增广一次就是
O(nm) 的。所以一次判定就是
Knm 的。总时间复杂度为
O(Knmlogn)。