【问题标题】:How to turn Prim's algorithm into Kruskal's algorithm?如何将 Prim 的算法变成 Kruskal 的算法?
【发布时间】:2009-09-03 08:45:54
【问题描述】:

我已经在 C 中实现了 Prim's algorithm (www.bubblellicious.es/prim.tar.gz),但我只是想知道如何将其转换为 Kruskal's algorithm

看起来它们很相似,但我无法想象如何将旧代码修改为新代码。给点建议什么的就好了。我知道这很容易,但我仍然是 C 编程的 n00b ...

【问题讨论】:

  • 如果您在问题中内联发布相关代码,您更有可能获得有用的回复。 Prim 的算法只有四行伪代码,所以我不敢相信需要六个文件的 tarball。
  • 嗯,你可以只读取主文件,因为没有必要查看所有文件。
  • 恕我直言,这些算法不够相似,因此从一种转换到另一种是有利可图的——Prim 需要某种优先级队列,而 Kruskal 则涉及全局排序的边列表。你最好从头开始。

标签: c algorithm minimum-spanning-tree prims-algorithm kruskals-algorithm


【解决方案1】:

为什么不直接从头开始编写 Kruskal 并在您自己的解决方案中比较它们呢?最好的学习方式。

【讨论】:

    【解决方案2】:

    要转换,您需要一个森林(即一组树,其中最初每个节点都是一棵树)作为您的临时输出结构,而不是一棵树。然后在每一步,而不是找到将当前未连接节点添加到树中的最便宜的顶点,而是在图中找到最便宜的边,如果它创建一棵新树(即连接两个以前未连接的节点),则将该树添加到森林并移除源树。否则丢弃边缘。 Kruskal 的正确实现比正确的 Prim 实现更占用内存,但耗时更少。

    但两者之间的差异相当大。可能您只能保留一些辅助函数和一些数据结构。不是转换,而是使用更高级别的构建块进行重写。

    【讨论】:

      【解决方案3】:

      为什么不考虑切换到 C++ 并使用 boost 图形库 (http://www.boost.org/)?

      它包含两种算法的非常好的实现。类型安全且高性能。 见kruskal_minimum_spanning_treeprim_minimum_spanning_tree

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-02
        • 1970-01-01
        • 2011-05-16
        • 2016-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多