【问题标题】:minimum spanning tree out of adjacency matrix邻接矩阵中的最小生成树
【发布时间】:2011-05-01 17:12:37
【问题描述】:

我有一个问题,我真的很苦恼。我有一组带有加权边的点,我需要创建一个最小生成树来找到所需的最短边数。我需要用java来做。现在我让它创建了一个邻接矩阵,这就是我卡住的地方。我真的不知道下一步该去哪里。任何帮助都会很棒。

【问题讨论】:

  • 这里有一个提示 - 编写一些代码并发布它。我们不做作业。如果你付出一些努力并提出具体的问题,你会得到更好的回应。另外,将此标记为家庭作业。并阅读:catb.org/~esr/faqs/smart-questions.html
  • @debracey,你在说什么? Dijkstra 是最短路径,OP 需要最小生成树,如 Prim 或 Kruskal 算法。
  • @debracey:我不认为 Dijkstra 的算法可以用来找到最小生成树。它可以用来找到两个节点之间的最短路径,仅此而已。也许您正在考虑 Kruskal 算法。

标签: java graph minimum-spanning-tree


【解决方案1】:

看看 Kruskal 和 Prim 算法, 我真的很喜欢 Prim,因为它非常易于实现和理解:http://en.wikipedia.org/wiki/Prim%27s_algorithm

关于您的问题,下一步做什么(恢复 Prim 算法): 选择一个随机顶点并以较小的成本获得边缘,将其插入您的 MST。 虽然您的 MST 中没有所有顶点: 从您的 MST 边缘中选择成本较小的边缘并将其插入您的 MST。

【讨论】:

    【解决方案2】:

    如果您试图找到最小生成树,您将始终拥有相同数量的边,只是权重不同。我推荐用来解决这个问题的方法是 Prim 算法。当您有明显的加权边缘时,它最有效。尽管其他人已将其作为一种可能性进行了讨论,但我将在此处对其进行全面解释,以使用无向连通图解决最小生成树问题。

    Prim 的第一步是从任何顶点 V 开始,并将其添加到(当前)名为“已发现”的空顶点集。从那里,您将查看与 V 相邻的所有边(使用您的邻接矩阵)并连接到不在“已发现”中的顶点(使用您的已发现集),并将它们添加到最小堆结构。堆将允许您获取最小边并将其添加到新的树结构中。该边的另一端是您的下一个新起始顶点。重复此过程,直到获得最小生成树。

    【讨论】:

    • 请详细说明您选择的算法。它支持负权重吗?对于(严格的)正权重来说,它是最有效的吗?
    猜你喜欢
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多