题目大意:有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费是0.39,那么你可以得到(100 - 0.39) * 29.75 = 2963.3975 B币。问s币的金额经过交换最终得到的s币金额数能否增加。
这道题能加深对Bellman-Ford的理解。才发现Bellman-Ford不止能求最短路,也能求一类“最优路”问题。
和求最短路一样,给每个节点一个dist[]标号,这里表示该节点金币额的下界。然后就像最短路那样“松弛”:
对于每条边(u,v), dist[v] = max(dist[v], [dist[u]-commission(u,v)] * rate(u,v));
最后判断一下dist[s]是否比初始值大即可。
#include
#include
#include
#include
#include
#include
#include
#include
#include