为什么不能在有向图上使用Prim或Kruskal的算法?

时间:2014-03-26 00:55:16

标签: algorithm graph graph-algorithm prims-algorithm

Prim和Kruskal的算法用于查找连接和无向图的最小生成树。为什么不能在指示的图表上使用它们?

2 个答案:

答案 0 :(得分:27)

这些算法首先起作用是一个小小的奇迹 - 大多数贪婪算法只会在某些情况下崩溃并烧毁。假设你想用它们来找到最小的跨越树枝(从一个顶点到所有其他顶点的有向路径),那么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,但我们真的想要成本为1的a-> a和成本为1的a-> b。

答案 1 :(得分:5)

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

在Prim算法中,我们将图分成两组顶点。已经形成MST(Set1)的一组探索顶点和另一组未探测顶点将最终连接第一组以完成“跨越”(Set2)。在每个瞬间,我们选择加入两个不相交集的切割中的最小加权边。如果没有探测到的MST节点的有向边缘仍然未被探索,即使从未探测的节点到MST中探索的节点存在边缘,算法也会卡住。

在Kruskal的算法中,我们的想法是按重量按升序对边缘进行排序,然后将它们按顺序拾取并将它们包含在MST探索的节点/边缘中,如果它们已经形成了已经探索过的节点的循环。这是由Union-Find DS完成的。但是用这种方法检测有向图的循环失败了。例如:将报告包含边[1> 2] [2-> 3] [1-> 3]的图形包含具有Union-Find方法的循环。

所以Prim失败了,因为它假定,每个节点都可以从每个节点到达,虽然对于有向图而言对于无向图有效可能不正确。 Kruskal由于未能检测到周期而失败,有时必须添加边以使周期满足MST的“最小”加权属性。

此外,对于有向图,MST并不完全合理。对于有向图的等价物是“最小跨越树状”,它将产生一个树,其中每个顶点都可以从一个顶点到达。