【发布时间】:2014-04-24 01:48:25
【问题描述】:
我正在学习最小生成树。我通过 Prim 的加权有向图算法。
算法很简单
- 您有两组顶点,已访问和未访问
- 将所有边的距离设置为无穷大
- 从未访问集中的任何顶点开始并探索其边缘
- 在所有边中,如果目标顶点未被访问且边的权重小于目标顶点的距离,则使用边的权重更新目标顶点的距离
- 选择距离最小的未访问过的顶点,然后再重复一遍,直到所有顶点都被访问过
相信通过上面的算法,我一定能在所有生成树中找到代价最小的生成树,即最小生成树。
但是我把它应用到下面的例子中,我认为它失败了。
考虑下面的例子
顶点是 {v1,v2,v3,v4,v5} 和权重的边
(x,y) : w =>
(v1,v2) : 8
(v1,v3) : 15
(v1,v4) : 7
(v2,v5) : 4
(v4,v5) : 7
首先我探索 v1,它有到 v2、v3、v4 的边,所以图变成了
访问顶点 v1 并且 (顶点, 距离) =>
(v2,8)
(v3,15)
(v4,7)
现在 v4 的距离最短,即 7,所以我探索 v4,它与 v5 有边缘,所以会发生以下修改
访问顶点 v4 并且 (vertex, distance) => (v5,7)
现在 v5 的距离最短,即 7 ,所以我探索 v5 并且它没有任何边缘,所以我只是将其标记为已访问
Vertex v5 被访问
现在,混乱从这里开始
距离最小的顶点现在是 v2,它的边到 v5,权重为 4,当前 v5 的距离为 7,之前由边 (v4,v5) : 7 分配,所以,我相信这样做最小生成树,v5 的距离应该从 7 更新到 4,因为 4
我说对了吗?还是我做错了什么?
谢谢
【问题讨论】:
-
你描述的其实是Prim的算法,但它只适用于无向图。在有向版本上引用Wikipedia:“对于有向图,最小生成树问题称为Arborescence 问题,可以使用Chu–Liu/Edmonds 算法在二次时间内求解”。跨度>
-
它甚至可以在 m + n log n 中解决,就像 Prim 一样
标签: algorithm graph minimum-spanning-tree prims-algorithm