【问题标题】:Why can't Prim's or Kruskal's algorithms be used on a directed graph?为什么不能在有向图上使用 Prim 或 Kruskal 的算法?
【发布时间】:2014-03-26 00:55:15
【问题描述】:

Prim 和 Kruskal 的算法用于找到连通图和无向图的最小生成树。为什么不能在有向图上使用它们?

【问题讨论】:

  • 那么,有向图上的生成树的定义是什么?
  • 对于有向图,与 MST 类似的问题是最小成本跨越树木场景或最小分支问题。 Edmond's algorithm 可以用与 Prim 相同的渐近复杂度来实现,但它在概念上更复杂。

标签: algorithm graph graph-algorithm prims-algorithm


【解决方案1】:

这些算法一开始就起作用是一个小奇迹——大多数贪心算法在某些情况下会崩溃和烧毁。假设您想使用它们来找到最小跨度树状结构(从一个顶点到所有其他顶点的有向路径),那么 Kruskal 的一个有问题的图如下所示。

 5
  --> a
 /   / ^
s   1| |2
 \   v /
  --> b
 3

我们将采用成本 1 的 a->b 弧,然后卡住了,因为我们真的想要成本 3 的 s->b 和成本 2 的 b->a。

对于 Prim,此图有问题。

 5
  --> a
 /   /
s   1|
 \   v
  --> b
 3

我们将采用成本为 3 的 s->b,但我们确实想要成本为 5 的 s->a 和成本为 1 的 a->b。

【讨论】:

  • 我想补充一点,第一个示例如何无法使用 kruskal 形成 mst。首先我们得到成本为 1 的边 (a,b),然后我们看到下一条边是成本 2 的 (b,a) 但不能使用,因为 a 和 b 在同一个集合中,而 kruskal 的算法赢了不允许。现在是成本为 3 的边 (s,b),kruskal 算法将允许,因为 s 和 b 不在同一个集合中,但如果我们添加 (s,b) 边,则形成的结构不是树,这是一个图,因为在有向树中,您不能有两个出度为 1 的节点。
【解决方案2】:

Prim 和 Kruskal 的算法为连通图和“无向”图输出最小生成树。如果图没有连接,我们可以调整算法以输出最小生成森林。

在 Prim 的算法中,我们将图分成两组顶点。一组已探索的顶点已经形成了一个 MST(Set 1),另一组未探索的顶点最终将加入第一组以完成“spanning”(Set 2)。在每一时刻,我们在连接两个不相交集的切割中选择一个最小加权边缘。如果从 MST 的已探索节点到剩余的未探索节点之间没有有向边,即使 MST 中存在从未探索节点到已探索节点的边,算法也会卡住。

在 Kruskal 算法中,想法是按边的权重升序对边进行排序,然后按顺序拾取它们,如果它们尚未与任何已探索节点形成循环,则将它们包含在已探索节点/边的 MST 中。这是使用联合查找数据结构完成的。但是这种方法无法检测有向图的循环。例如,包含边 [1->2] [2->3] [1->3] 的图将使用 Union-Find 方法报告包含一个循环。

所以 Prim 失败了,因为它假设每个节点都可以从每个节点到达,尽管对于无向图有效,但对于有向图可能不正确。 Kruskal 的失败是因为未能检测到循环,有时必须添加边制作循环以满足 MST 的“最小”加权属性。

此外,对于有向图,MST 并不完全有意义。它与有向图的等价物是“最小跨度树状结构”,它将生成一棵树,其中每个顶点都可以从单个顶点到达。

【讨论】:

  • :) 谢谢灰胡子。现已更正!!
  • "失败,因为它假设每个节点都可以从每个节点到达" -> 如果你有一个完整的有向图(即反向边具有不同的权重),那么 Prim 的算法将仍然没有给你最小生成树(相当于无向图)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 2010-11-14
相关资源
最近更新 更多