【问题标题】:How to look for the edges that must exist in every minimum spanning trees of a weighted graph如何查找加权图的每个最小生成树中必须存在的边
【发布时间】:2018-10-20 10:26:56
【问题描述】:

但是,给定一个无向加权图,边的实际权重是未知的;相反,每个边缘都被分类为轻、中或重。

所有轻边的权重都小于任何中等或重边。

所有中边的权重都小于任何重边

一般来说,对于同一权重类中的两条边之间的关系,我们一无所知。 那么,如何识别该图的每个 MST 中必须存在的所有边呢?以下是我的想法: 1.确定强连通分量的个数。 2. MST中必须存在由关节点组成的边。 3. 每个连通分量中最轻的边必须存在于 MST 中。

我不确定我的想法是否正确?如果正确,如何用java实现代码?非常感谢。

【问题讨论】:

  • 您问题的理论部分可能更适合cstheory.stackexchange.com
  • 谢谢。我已将此问题转移到 stackexchange。
  • 为什么需要边之间的关系?只需将 weight=1 分配给轻类中的所有边,将 weight=2 分配给中类边缘,将 weight=3 分配给重类边缘,然后运行任何 MST 算法并找出它包含哪些边
  • 是的,这是个好主意。但问题是确定每个 MST 中必须存在的边,而不是所有边。谢谢
  • 我写的是“所有边缘”吗?你为你的图找到 MST 并检查它的边缘。这些边缘将出现在满足该分类的每个 MST 中

标签: java data-structures


【解决方案1】:

Jason,我不会深入描述如何用 Java 实现代码,而是让我们看看算法背后的思考过程。

由于您的顶点分为三个权重类别,我们可以使用比较权重重新标记它们,如下所示:Light 为 1;中为 2;重为 3。这样,您的条件得以维持。

接下来,我们可以像往常一样使用 Kruskal 的最小生成树算法 (MST) 在无向加权图上创建最小生成树。这个算法是贪心的,所以它会将边从轻到重排序,只要不产生循环就选择下一个最小的边,然后重复步骤 2,直到所有顶点都包含在 MST 中。 (请参阅下面的链接以供参考) https://www.geeksforgeeks.org/kruskals-minimum-spanning-tree-algorithm-greedy-algo-2/

在验证您的算法是否正确时,有两种可能的情况。

1)。您可以显示 MST 和排除的边缘的实际权重。检查排除边,如果在向 MST 添加排除边时,该边不是循环中最重的边,则将其与最重的边交换。继续这样做,直到探索所有最初排除的边并且 MST 保持其包含每个顶点的属性。 2)。您无法显示图中任何顶点的实际权重。在这种情况下,甚至无法验证您的算法是否创建了最小生成树,因此您的算法将无法自我检查。无论如何,使用具有比较权重的 Kruskal 算法将创建一个非常接近最小值的生成树,即使不知道实际权重。

【讨论】:

    【解决方案2】:

    这是一个在 O(|E|)- 时间内运行的简单算法。

    1. 初始化一个空集 S。
    2. 将图中的所有桥梁添加到 S.
    3. 从图中删除所有粗边。
    4. 将图中的所有桥梁添加到 S.
    5. 从图中删除所有中间边
    6. 将图中的所有桥梁添加到 S.
    7. 返回 S.

    有一些快速算法可以找到图中的所有桥,例如this one


    为什么上面的算法是正确的?

    关于表征全 MST 边的定理:当且仅当对于包含该边的任何循环,该循环还包含比该边重的边时,一条边出现在每个最小生成树中.

    上面的定理被证明here。顺便说一句,在图的每个 MST 中的一条边有时称为关键 MST 边。


    问题中给出的算法不正确。例如,所有 3 条边都归类为光的三角形。再举一个例子,一个三角形,一个轻边,一个中边和一个重边。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多