有向无环图中最大长度为k的两条点不相交s-t路径算法求解
问题解答
算法思路说明
你最初的思路方向是对的,只是普通最大流模型没有加入「路径长度不超过k」的约束,才会出现无法得到符合要求解的问题。下面给出两种多项式时间复杂度的可行方案:
方案1:带层数约束的最大流构造法
这个方法通过扩展网络维度显式加入长度约束,逻辑直观易实现:
- 第一步:处理点不相交约束
把每个节点u拆为u_in和u_out两个节点:- 原图所有指向u的入边全部连到
u_in - 原图所有从u出发的出边全部从
u_out出发 - 对普通中间节点,加边
u_in → u_out,容量为1,保证每个节点最多被1条路径经过 - 对起点s和终点t,加边
u_in → u_out,容量为2,允许两条路径经过这两个点
- 原图所有指向u的入边全部连到
- 第二步:处理长度不超过k的约束
把拆分后的所有节点复制k+1份,第l份(l从0到k)代表走到这个节点时,路径总长度刚好为l:- 对每个拆分边
u_in → u_out,在每一层l都保留这条边,容量和之前一致 - 对原图每条边
u→v,对所有l≤k-1,加边(u_out, l) → (v_in, l+1),容量为1,代表走这条边后路径长度加1 - 新增超级汇点T,对所有l≤k,加边
(t_out, l) → T,容量为2,允许所有长度不超过k的路径汇入汇点
- 对每个拆分边
- 第三步:计算最大流
以(s_in, 0)为源点,超级汇点T为汇点计算最大流,若最大流≥2则返回true,否则返回false。
时间复杂度分析:整个网络的节点数为O(kn),边数为O(k(m+n)),因为我们只需要判断流是否≥2,最多只需要2次增广,总时间复杂度为O(k(m+n)),属于多项式级别。
方案2:Suurballe算法优化方案
如果k数值很大,方案1的空间开销会偏高,可以用专门求解两条不相交最短路径的Suurballe算法:
- 首先运行一次最短路径算法(因为输入是有向无环图,可以直接用拓扑排序递推求最短路径,时间复杂度O(n+m)),得到s到t的最短路径长度,如果已经大于k,直接返回false。
- 按照Suurballe算法的规则修改边权,将第一条最短路径的中间节点标记为已占用后,再次寻找一条点不相交的s到t的最短路径。
- 若能找到第二条路径,且两条路径的最大长度≤k,返回true,否则返回false。
时间复杂度分析:仅需要两次最短路径计算,总时间复杂度为O(n+m),比方案1效率更高。
常见误区说明
你提到的「最短增广路径策略无法得到最优解」的问题,本质是普通最大流模型没有加入长度约束,导致增广得到的路径可能超过k的限制,只要把长度约束显式加入网络模型,就可以解决这个问题。
内容的提问来源于stack exchange,提问作者alkamal
相关产品推荐
相关产品推荐

