Algorithm 为什么Prim或Kruskal的算法不能用于有向图?

Algorithm 为什么Prim或Kruskal的算法不能用于有向图?,algorithm,graph,graph-algorithm,prims-algorithm,Algorithm,Graph,Graph Algorithm,Prims Algorithm,Prim算法和Kruskal算法用于寻找连通无向图的最小生成树。为什么它们不能用在有方向的图上?这些算法一开始就能工作,这是一个小小的奇迹——大多数贪婪算法只是在某些实例上崩溃和烧毁。假设您希望使用它们来找到从一个顶点到所有其他顶点的最小跨度树状定向路径,那么Kruskal的一个有问题的图如下所示 5 --> a / / ^ s 1| |2 \ v / --> b 3 我们将采用成本1的a->b弧,然后陷入困境,因为我们确实需要成本3的s->b和成本2的

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

这些算法一开始就能工作,这是一个小小的奇迹——大多数贪婪算法只是在某些实例上崩溃和烧毁。假设您希望使用它们来找到从一个顶点到所有其他顶点的最小跨度树状定向路径,那么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。

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

在Prim算法中,我们将图分成两组顶点。一组已探索的顶点已形成MST集1,另一组未探索的顶点最终将连接第一组以完成生成集2。在每一时刻,我们在连接两个不相交集的切割中选择一条最小加权边。如果没有从MST的已探测节点到剩余未探测节点的定向边,则即使MST中有从未探测节点到已探测节点的边,算法也会被卡住

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

所以Prim失败了,因为它假设每个节点都可以从每个节点访问,虽然对无向图有效,但对有向图可能不成立。Kruskal's之所以失败,是因为未能检测到循环,有时有必要添加生成循环的边,以满足MST的最小加权特性


同样,对于有向图,MST也没有完全意义。有向图的等价物是最小生成树状图,它将生成一棵树,其中每个顶点都可以从一个顶点到达。

那么,有向图上生成树的定义是什么?有向图的MST的类似问题是最小成本生成树状图或最小分支问题。可以用与Prim相同的渐近复杂性来实现,但在概念上更复杂。:谢谢greybeard。现在更正!!失败,因为它假设每个节点都可以从每个节点访问->如果您有一个完整的有向图,即反向边具有不同的权重,那么Prim的算法仍然不会为您提供与无向图等效的最小生成树。我想补充一点,第一个示例无法使用克鲁斯卡尔。首先我们得到成本为1的边a,b,然后我们看到下一条边是成本为2的边b,a,但不能使用,因为a和b在同一集中,kruskal的算法不允许使用。现在是代价为3的边s,b,这是kruskal算法允许的,因为s和b不在同一集中,但如果我们加上s,b边,那么形成的结构不是树,它是一个图,因为在有向树中,不能有两个超度为1的节点。