子图上的 MST 递归构造

Posted

技术标签:

【中文标题】子图上的 MST 递归构造【英文标题】:MST recursive construction on subgraph 【发布时间】:2020-03-14 15:48:00 【问题描述】:

MST 表示:最小生成树。

给定一个图形 g = (V, E)。将顶点任意划分为 2 个不相交的集合,V1 和 V2。 令 E1 是 V1 中具有两个事件顶点的所有边 令 E2 是 V2 中具有两个事件顶点的所有边 设 E3 是所有边,在 V1 中有一个事件,在 V2 中有一个事件

现在在子图(V1,E1)上构造一个 MST M1,在子图(V2,E2)上构造一个 MST M2。然后在 E3 中添加连接 M1 和 M2 的最低权重边。这是在原始图 g 上构建 MST 的结果吗?

【问题讨论】:

【参考方案1】:

我的答案是否定的。

考虑图 G:顶点:A,B,C,D 边:AB = 1,BD = 10,DC = 3,AC = 2。当它被划分为V1 = A, C V2 = B, D E1 = AC E2 = BD E3 = AB, CD时,根据描述MST是AC, AB, BD ,而真正的 MST 是 AB, AC, CD。

回想一下 Kruskal 算法:边按权重升序排序,不形成循环的边将与 MST 中已存在的边一一添加。 MST 是树,因此将选择 |E|-1 条边(假设 MST 中没有孤立顶点)。如果 |E1| 1,则在整个图 G 上执行 Kruskal 算法时,E3 中的多条边将被添加到 MST。如果MST由M1 M2和E3中最小的边构成,可能会丢失一些边。

此外,如果我们在整个图 G 上实现 Kruskal 算法,则可能会添加多个 E3 中的小边(我们称它们为 E3')。如果我们在 V1 E1 和 V2 E2 上分别实现 Kruskal 算法,则比 E3' 中的边大的边将被添加到 M1、M2 中。并且只会添加 E3 (E3') 中的最小边。因此,第二个 MST 的总重量大于第一个,它不是真正的 MST。

在任何情况下单独构建 MST 与在整个图表上构建它是相同的吗?

    当 E3 只有一条边时:

    在整个图 G 上实现 Kruskal 算法时,这条边将被添加到 MST 中,因为它不会与任何边形成循环。并且它不会影响任何其他边缘的决策。

    当M1、M2都是无隔离的连通树时 E3 中的顶点和至少 |E3|-1 个边是 E.

    当在整个图上执行 Kruskal 算法时,E3 中的最小边将被添加到 MST 中。它不影响在 E1 或 E2 中添加的任何其他边的决定。因为它不会与 E1 或 E2 中的任何边形成循环。而E3中的其他边不会被添加,因为它们是Kruskal算法中要考虑的最后一条边,它们将与MST中已经存在的边形成一个循环。

【讨论】:

以上是关于子图上的 MST 递归构造的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib 在所有子图上显示 x-ticks 和唯一的 y 标签

MATLAB - 如何一起缩放子图?

Plotly 峰值未出现在子图上

Plotly:如何在子图上绘制烛台图?

在 R plotly 子图上获取单独的轴标签

Plotly:如何为所有子图设置 xticks?