有向图

时间:2015-12-28 09:48:52

标签: algorithm graph computation-theory breadth-first-search

我对这个问题有疑问:

c1,c2,...,cn n 不同的货币。 1美元货币 ci 可以以货币 cj 购买 w_ij> 0 美元。鉴于所有汇率 wij ,我们希望找到以货币 c1 开头的货币 cn 的最佳方式。

  1. 最优汇率是否始终存在?
  2. 鉴于存在最优汇率,设计一个多项式时间算法来表示最优汇率。
  3. 基本上我们要做的是找到一个从最大权重到 ci cj 的路径,对吧?我正在考虑使用拓扑排序之类的东西,但问题是 ci cj 之间有两条路径,一条来自 ci cj 的值为 w_ij ,另一个来自 cj ci ,其值为 1 / w_ij < / em>的。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

考虑边权为 -log w_ij 的有向图。此图中从 c_i c_j 的最短路径对应于从 c_i 开始购买 c_j 的最佳方式。

如果图表有一个负周期,那么就没有最短(非简单)的路径,也没有最好的购买货币的方法:总有一种更好的方式可以对应于在周期内走动几次。

Bellman-Ford算法在多项式时间内工作。如果存在负循环,它可以报告负循环,如果没有这样的循环,则找到最短路径。

答案 1 :(得分:-1)

为了计算节点的最大路径,我们计算每个其他节点,从当前节点到另一个节点的权重乘以另一个节点的最大路径值(递归计算),以及然后我们选择最大的此类产品。

def maxPath(weights):

  def _maxPath(i):
    if path_nodes.get(i):
      return 0
    elif i==n-1:
      return 1
    path_nodes[i]=1

    max_path=0
    for j in range(0, n):
      cur_path=weights[i][j]*_maxPath(j)
      if cur_path>max_path:
        max_path=cur_path

    del path_nodes[i]
    return max_path

  n=len(weights)
  path_nodes = {}
  return _maxPath(0)

def main():
  weights=[[1,2,3],[0.5,1,4],[0.33, 0.25, 1]]
  print(weights)
  print(maxPath(weights))