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