Suurballe's Algorithm(计算点s到每个点的两条边不相交路径的和的最小值,模拟费用流)

本文介绍了Suurballe算法,用于解决计算点s到每个点的两条边不相交路径的和的最小值问题。该算法通过反向边权和最短路树,模拟费用流,实现O(nlogn)的时间复杂度。文章详细阐述了算法步骤,包括边权的重赋值,Dijkstra类似算法的应用,以及避免DFS最大子树的方法,证明了算法的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意如题。
有向边,边权非负。
一个简单的暴力是对于每个点为汇点跑流量为 2 2 2的最小费用流。
不知道卡不卡 S P F A SPFA SPFA。(费用流反向边权值是负的。)
当然你可以 J o h n s o n Johnson Johnson算法跑有理有据的 d i j k s t r a dijkstra dijkstra费用流, O ( n 2 log ⁡ n ) O(n^2\log n) O(n2logn)
但是 J o h n s o n Johnson Johnson算法本身就是该算法的一个特殊情况而已。

t a r j a n tarjan tarjan s u u r b a l l e suurballe suurballe的论文

具体做法是:
类似于费用流,求一个点 v v v的答案就是将最短路树上 v v v s s s的边全部取反方向和权值,再跑一边最短路即可。
求出 s s s为源的最短路树和 d i s v dis_v disv后重赋边权, c s t ′ ( u , v ) = c s t ( u , v ) + d i s ( u ) − d i s ( v ) cst'(u,v) = cst(u,v) + dis(u) - dis(v) cst(u,v)=cst(u,v)+dis(u)dis(v)
然后树边权值为 0 0 0
然后跑一次类似于 d i j k s t r a dijkstra dijkstra的东西,具体来说是:
维护一个 d i j k s t r a dijkstra dijkstra用的 d u d_u du表示目前到 u u u的最短路,每次拿出 d u d_u du最小的没有用于更新的点来更新。
更新操作是在 u u u所在的连通块中(事情开始不对劲了),把 u u u到该联通块内点 v v v的边拿出来更新一下 d v d_v dv,把该联通块内的点对 ( v , w ) (v,w) (v,w)之间的边拿出来,如果 u u u删除后 v , w v,w v,w不联通了就用 d u + c s t ′ ( v , w ) d_u + c

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值