(今天训练赛的题, 回寝把思路理了一下把代码写出来了)
思路:
spfa判负环
以货币类型建图
从S开始, 如果能找到一个环, 使得从沿着这个环兑换一轮后货币量增加了(即注释所谓”增环”(自造词)), 则说明可以倒获得利益
(类似于判负环但其实不是负环)
下面给个简单证明:
假设某个”增环”中有三个结点:
假设1开始时为x个货币, 沿环一圈后货币量为:
$\ \ \ \ ( ( r_{1} x - r_{1} c_{1} ) \cdot r_{2} - r_{2} c_{2} ) \cdot r_{3} - r_{3} c_{3} $
$ =r_{1} r_{2} r_{3}x - ( r_{1} r_{2} r_{3} c_{1} + r_{2} r_{3} c_{2} + r_{3} c_{3} ) $
$ >\ x $
括号内为常量且大于0, 所以:
$ r_{1} r_{2} r_{3} x > x\ \ \ \Rightarrow\ \ \ r_{1} r_{2} r_{3} > 1 $
由函数相关知识可知, 对于更大的x, 上述不等式依然成立, 且可递推到无限(不知道咋证, 但应该是对的……(小声))
同时可推广结点数更大的环.
且可由S到该环, 则由题意, 必然可从该环到S, 且必然存在存在一个循环次数, 从该环循环该次数后, 回到S货币增加.
同时显然地, 至少应该存在一个包含S点的”增环”才能使得货币增加(从S到”增环”再回到S可看作是复用某些结点的”增环”).
证(luan)明(che)完后就是代码:
代码:
1 |
|