【问题标题】:Kruskal's Algorithm with disconnected graph具有断开图的 Kruskal 算法
【发布时间】:2014-04-09 22:34:29
【问题描述】:

当图有多个连通分量时,我不确定如何实现 Kruskal 算法

根据我对 Kruskal 算法的理解,它反复将最小边添加到集合中。然后当所有的边都被检查时,它会返回最多的边的集合。

但是,如果我的图表断开连接怎么办?说我有:

A - B - C - D

E - F

假设 Cost( A - B ) = Cost( E - F ) = 1,其余边大于 1

当我运行 Kruskal 时,我会获得所有边缘的成本,但我想获得连接组件的每个成本,因此我对所有连接组件进行平均最小成本。

【问题讨论】:

  • 这是一道编程题?在另一个 StackExchange 网站上,您可能会有更好的运气。
  • Kruskal 会给你一个最小的跨越森林。如果您想要该森林中一棵树的成本,只需将其相加即可。有什么问题?
  • 我需要取每个森林的平均值。
  • 您的语言不清楚。假设cost(B-C) 是 2,cost(C-D) 是 6。现在告诉我们你要计算什么。
  • Kruskal 在这种情况下会给你一个最小的跨越森林。只需要在运行 Kruskal 之前或之后找到连接的组件,真的没关系。

标签: algorithm graph minimum-spanning-tree kruskals-algorithm


【解决方案1】:

嗯,克鲁斯卡尔的算法是这样工作的:

它将逐个添加(联合)边,并专门维护不相交的集合。

听起来您正在为每组连接的顶点寻找一个最小生成树(这样你就可以玩弄那些单独的树的聚合,最小加权成本),是吗?

因此,您选择 Kruskal 而不是 Prim 是正确的(后者不会在断开连接的图上运行)。

Kruskal 将在您的断开连接的图表上正常运行;它将为每个连接的组件找到一个最小生成树

"对于未连接的图,克鲁斯卡尔算法返回一个森林 生成树——图的每个组件都有一个。”(a great paper on Spanning Trees by Michael P. Fourman— a Prof. of CS at University of Edinburgh)

或者,您可以在每个仅包含连接组件的子图上运行 Prim。

祝你好运(如果您还没有发现问题)。

Kruskal's Algorithm Pseudo-Code

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2017-07-04
    • 1970-01-01
    相关资源
    最近更新 更多