题目描述
套利是利用货币汇率差异将一种货币单位转换成一种以上相同货币单位。例如,假设1美元买入0.5英镑,1英镑买入10.0法国法郎,1法国法郎买入0.21美元。然后,通过转换货币,聪明的交易者可以从1美元开始,买入0.5 * 10.0 * 0.21 = 1.05美元,获利5%。
您的工作是编写一个程序,该程序将货币汇率列表作为输入,然后确定是否可以进行套利。
输入
第一行中,有一个整数n(1 <= n <= 30),代表不同货币的数量。
接下来的n行分别包含一种货币的名称。名称中不会出现空格(货币名称可能会重复)
下一行包含一个整数m,代表要遵循的表的长度。最后m行分别包含源货币的名称ci,
代表ci到cj的汇率的实数rij和目标货币的名称cj。没有出现在表中的交换是不可能的
(可能存在同币种不同汇率情况,保留汇率高的情况)
输出
yes或no的格式打印一行,说明是否可以套利。
样例输入
3 USDollar BritishPound FrenchFranc 3 USDollar 0.5 BritishPound BritishPound 10.0 FrenchFranc FrenchFranc 0.21 USDollar
样例输出
yes
算法:弗洛伊德
弗洛伊德:
弗洛伊德Floyd算法 ,是用来求所有顶点到所有顶点的最短路径。
我们可以直接对每个顶点通过迪杰斯特拉算法求得所有的 顶点到所有顶点的最短路径,为什么还要弗洛伊德算法?
弗洛伊德算法-动态规划思想
定义状态,划分阶段
1、我们设 d[k][i][j] 为除了 i 和 j 外只经过前 k 个结点,从 i 到 j 的最短路。
2、显然可以知道 d[0][i][j]=w[i][j]
3、那么当加入了一个顶点k之后,最短路如果有变化的话一定是以k为中间顶点, 那么可以得到: d[k][i][j] = min(d[k−1][i][j],d[k−1][i][k] +d[k−1][k][j])
4、这个算法的复杂度是O(|V|3)
最优子结构
最短路径的子路径仍然是最短路径,最优子结构可以保证
最短路径的子路径仍然是最短路径