【问题标题】:How to write this graph related algorithm如何编写此图相关算法
【发布时间】:2013-07-29 05:10:42
【问题描述】:

假设您有一列火车和 10.000 (0...9999) 个车站。火车在0号站。

每个站点都有一些货物要运送到任何其他站点。并且发往其他站的货物数量是随机的:每站1~100吨。

您的火车一次最多只能运载 50 吨。一旦火车在任何车站提货,它必须先卸货,然后才能提货(即,如果当前列车载重 1 吨,即使剩余 49 吨的空间也无法提货)。

因此,开发火车将在最短的时间内运送所有货物的算法。

【问题讨论】:

  • 看看here
  • Comp Sci stack exchange 回答此类问题可能会更好。
  • 算法应该怎么做?我假设您想找到最佳路径,但您应该明确提及它。找到一条非最优路径是一件容易的事,我认为你也可以贪婪地获得 2 近似值(仅凭直觉,而不是证明)。
  • @Krishna 这是一个编程挑战吗?另外,“最短时间”是指“最少停靠次数”吗?
  • @SaviourSelf...这是谷歌面试中提出的问题场景..

标签: c algorithm graph


【解决方案1】:

这是我第一次快速思考这个问题,如果我想到更好的答案,我会回来编辑我的答案。其他人也许能够接受我提供的东西并为您提供更多帮助。这是“蛮力”方法,可能有更好的解决方法。

  1. 枚举所有起点/终点对(看起来是一个输入)。-10,000 次操作。 对于需要比火车提供更多容量的车站,请将它们分成额外的起点/终点对。
  2. 枚举起点/终点对的所有排列 - 10,000!操作(n*n 复杂度) - 在循环内,不保存每个 一个。
  3. 对于每个排列,计算火车行驶的总距离。对于每一对,这将是之前的行驶距离 加上去起点的火车+去目的地的火车。对排列中的所有对执行此操作。比较 这个单一值到你之前的单一值。 如果它更小,请保留这个和一串排列。 如果你保留一个新的排列,就扔掉你以前的排列串。这应该是 10,000 * c (1?) 次操作。仅保存这些排列之一,如果 您保存所有这些,如果这样做,您将耗尽内存。我认为。

我认为它的复杂性约为 n+n*n+n = 2n+n^2。这对于 10,000 个站点应该是可行的。小心内存,当我最初开始写这篇文章时,我想保存所有可能需要 20,000 的排列!在内存中。

抱歉,我使用的是美国方式,而不是 .用于千位分隔符。

希望这会有所帮助!

【讨论】:

  • 请看here并点击[更多数字]几次。 10000! ~ 2.84 * 10^35659,而不是 n*n。
猜你喜欢
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多