【问题标题】:Minimum Hop Count in Directed Graph based on Conditional Statement基于条件语句的有向图中的最小跳数
【发布时间】:2020-07-01 06:53:45
【问题描述】:

一个有向图G由顶点V和边E给出,分别代表火车站和单向火车路线。

不同列车号的列车在一对顶点之间沿一个方向移动。

G的顶点通过分配列车号的列车相互连接。

当乘客在图表中移动时需要换乘火车时,定义了一个跃点。只有当车号发生变化时,乘客才需要换车。

给定两个顶点 V1V2,如何计算从 开始到达 V2 所需的最小跳数>V1


在上面的例子中,顶点 03 之间的最小跳数是 1。

从0到3有两条路径,分别是

0 -> 1 -> 2 -> 7-> 3

Hop Count 4

跳数为 4,因为乘客必须从火车 A 换到 B,然后再换到 C 和 B。

0 -> 5 -> 6 -> 8 -> 7 -> 3

Hop Count 1

Hop Count 为 1,因为乘客只需要一条火车路线 B ​​即可从 Vertices 0 到达 3

因此最小跳数为 1。


输入示例

输入图创建

输入待解决


输出示例

输出 - 用跳数求解

Hop Count 列中的 0 表示无法到达目的地

【问题讨论】:

  • 这张图中你有多少个顶点和边?还有多少个 trainID?
  • @JK,顶点数、边数和 trainID 数分别为 5000、10000 和 10。
  • 很好,我的算法应该可以解决这个问题。见答案;)

标签: algorithm graph graph-algorithm


【解决方案1】:

假设不同 trainID 的数量相对较小(例如您的示例中的 4 个),那么我建议使用分层图方法。

设顶点数为 N,边数为 M,不同 trainID 数为 K。
让我们将图划分为 K 个图。 (graphA, graphB, ...)
graphA 仅包含标有 A 的边,依此类推。
每张图中每条边的权重为0。
现在在这些图之间创建边。
图之间的边代表一个“跃点”
grapha[i] 连接到 graphB[i]、graphC[i]、...
这些边中的每一个的权重为 1。
现在,对于每个图,从该图中的 V1 运行 Dijkstra 的最短路径算法,并在所有图中从 V2 读取结果,取最小值。
这样,为每个图运行 dijkstra 的最小结果将是您的最小跃点数。
内存复杂度为O(K*(N+M))
时间复杂度为O(K*(((2^K)*N+M)*log(KV)))
(2^K)*N 来自这样一个事实,即对于每个 1

对于 K 相对较小的情况,例如您的示例中的 4,但 N 和 M 相当大,此算法的工作原理很吸引人。但不适合 K 较大的情况。

我不确定这是否清楚。如果您需要更详细的解释,请告诉我。

编辑: 希望这能让我的算法更清晰。
黑边的权重为 0,红边的权重为 1。
通过使用分层图方法,我们将特殊图转换为普通加权图,因此我们可以在其上运行 Dijkstra 算法。
抱歉,图片太丑了。

编辑: 由于 max K = 10,我们希望从时间复杂度中删除 2^K。我相信这可以通过将代表可能跃点的边虚拟化来实现,而不是将它们物理存储在邻接列表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多