首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有向图的最大加权路径

问有向图的最大加权路径
EN

Stack Overflow用户
提问于 2015-12-28 09:48:52
回答 2查看 2.1K关注 0票数 2

关于这个问题,我有一个问题:

设c1,c2,.,cn为不同货币。1美元的ci可以用cj货币购买w_ij>0美元。考虑到所有的汇率,我们想找出购买货币cn的最佳方式,从货币c1开始。

  1. 最优汇率总是存在的吗?
  2. 在最优汇率存在的情况下,设计了一种多项式时间算法来确定最优汇率。

基本上,我们要做的是找到一条从ci到cj的最大重量的路径,对吗?我想做一些类似拓扑排序的工作,但问题是ci和cj之间有两条路,一条是从ci到cj的值w_ij,另一条是从cj到值为1/w_ij的ci。我该如何解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2015-12-29 16:04:43

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

如果图有负循环,那么就没有最短的(非简单的)路径,也没有购买货币的最佳方法:总是有一个更好的方法,能更好地在循环中来回走几次。

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

票数 0
EN

Stack Overflow用户

发布于 2015-12-28 12:46:12

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

代码语言:javascript
复制
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))
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34491163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档