POJ3621 Sightseeing Cows

环形分数规划(最优比率环)

正常判环方式(SPFA正,队列,无SLF)
Memory: 2464K Time: 360MS
https://code.csdn.net/snippets/1631914

超快判环(抄题解,DFS版SPFA)
Memory: 768K Time: 94MS
代码同上,将spfa改成spfa2即可体验飞的感觉

题意

找出图中一个环,使环上 iV[i]iC[i] 最大,V[i]为点权,C[i]为边权

分析

很容易想到把点权转移到边上。因为一个环中点数和边数是一样的。
把边的起始点的点权当作边的第二个属性即可。

以前的01分数规划方式,是二分答案ans,计算可能达到的最大 m(V[i]ansC[i]) 的值,通过它的正负判断最优解所在的区间(这个原理必须弄明白)

这道题里,没有明确规定找出的边数,但要求找出的几条边必须组成一个环。如果还二分的话,什么可以是拿来判断的条件呢?
同样的思路,计算图中使得 i(V[i]ansC[i]) 最大的一个环,然后判断这个最大值的正负。
乍看之下计算“使得&%@#^*!最大的环”貌似不是多么容易实现。但是我们不需要具体值,只需要判断这个值的正负就行了。那么把所有边的边权改成 V[i]ansC[i] ,然后判断是否存在正环,不就完美地实现了我们需要的要求吗?

出错点

1.SPFA判环要从所有点都试一遍。
网上很多题解写得都是只从1开始判,这样其实是有问题的。比如如果图不连通,正环不能从1抵达,则会错判为无环。
初始化队列时,把所有点都加进去就行了
或者像是一般差分约束一样,建立一个超级源,权0指向所有点,然后加入超级源即可。感觉有点舍近求远了。

2.此处省略+∞个脑残错误…

其他的…

这道题时间卡在判断正环的地方了。所以常数必须足够优才行。
我一开始用C++输入输出流,发现就算关了流同步,时间耗费也吓人。非优化版BFS-SPFA直接超时没得说,大神版DFS-SPFA有94ms的潜力(其实人家有16ms的潜力的,只是我写的程序常数呵呵),也生生地被拉成了800ms。可见scanf/printf/puts是个好习惯。

大神版DFS-SPFA判环超神,值得研究。

对拍用的数据生成器可以找我要。(本弱菜写的生成器生成的数据同样弱,而且不时会RE,不过自我感觉良好~)

谨此。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值