终于实现了用SAP(伪)解费用流

  省赛前因为有战哥超哥在,图论碰都没碰,所以最近给自己搞了套网络流题目做做,恶补一下。

 

  结果么才做了三道题,就被个王杰波秒掉了,郁闷。。。

 

  今天在做HDU2686——matrix,最大费用流的。一说到这个matrix么我又要说王杰波了,今天叫我推荐电影,可这么大个人居然黑客帝国一点都没看过,唉~~~PS:直接写名字觉得很别扭,本来想叫波波的,可是有个上海人很恶心,直接称呼自己为这个,那我就不这么叫了。

 

  之前只知道费用流解法是找个最短或最长路然后增广,最大费用就最长路么,那这样每次都要spfa感觉效率不高吧,我就想能不能用SAP维护最短路的方法呢?spfa跑一次,接下来就维护下好了。

 

  仔细想了想发现很类似啊,最大流就是费用都为1的费用流,本来最大流的增广路上相邻点标号要相差1,现在费用流么改为要相差边上的费用就好了。

 

  但写起来就发现自己的脑子不够好使,各种头大,经常想着想着就一片空白,于是三国杀会儿=。=

 

  比如说gap优化,某个距离的点没了就断档了就break,但费用流里的值本来就不是连续的,如何判断断档就不会了。

 

  还有会出现两个点互相更新标号的死循环情况,想知道为什么会出现,可是想到一半就想不下去了。

 

  最后搞了个mark数组,在当前寻找到的增广路上的点标为1,接下去寻找的时候跳过这些点,然后不知道怎么搞了一下不伦不类地勉勉强强解决了上面两个问题。

 

  还有负边上的费用到底标正值还是负值,更新标号时选后继中最小的还是最大的都想了半天。

 

  sap求最大流要把点的标号更新时,取最小的那个后继,然后不管正负边都是+1,也就是加上费用1。但搞费用流时,加上的费用却要跟后继边的正负同性,又头大了,又想不通了。(写到这里又想了想似乎应该是因为求最大流时那费用是无向的,仅仅是到汇点的距离而已,而费用流里这个费用是有向的)。

 

  总之最后就是个不伦不类的SAP,更纠结的是常规方法0ms的题目我得花15ms=。=写得的实在太挫了。

 

  不过总算A了。

 

  事后上网查了下,加上sap搜了下费用流,找到了篇别人写的sap解费用流,还是个高中女生=。=(哈哈,没看出来我歧视女生吧?那就好)

 

  http://blog.sina.com.cn/s/blog_51cea4040100hanq.html

 

  不过也有说这方法效率不高,无所谓啦,反正下个月比赛时我还是老老实实用最简单的spfa+增广=。=

 

  不过有战哥在,图论我还是靠边吧=。=

 

  哦啦~~~~

 

  最后附上刚搜来的zkw的sap网络流,地址:http://www.artofproblemsolving.com/Forum/blog.php?b=13015

 

  听说是举世无双的高速短码网络流算法,是不是哟?~~~无限膜拜哟~~~~~=。=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值