当前位置: 首页 > 知识库问答 >
问题:

图有2/3个不同的最小生成树?

狄玮
2023-03-14

我正在尝试找到一种有效的方法来检测给定的图形 G 是否具有两个不同的最小生成树。我还在尝试找到一种方法来检查它是否有 3 个不同的最小生成树。我所讨论的天真解决方案是运行一次 Kruskal 的算法并找到最小生成树的总权重。稍后,从图中删除一条边并再次运行 Kruskal 算法,并检查新树的权重是否是原始最小生成树的权重,以及图中的每个边的权重。运行时为 O(|五||E|log|V|)这根本不好,我认为有更好的方法可以做到这一点。

任何建议都会有所帮助,提前感谢

共有3个答案

傅边浩
2023-03-14

假设G是一个有n个顶点和m条边的图;任何边e的权重是W(e);并且P是G上的最小权重生成树,权值为成本(W, P)。

设δ =任意两个边权重之间的最小正差。(如果所有边的权重都相同,那么δ是不定的;但是在这种情况下,任何一个ST都是MST,所以没关系。)取ε使得δ

当e在P中时,用U(e)=W(e) ε创建一个新的权函数U(),否则U(e)=W(e)。计算Q,G在U下的MST . If Cost(U,Q)

上面的方法确定是否存在至少两个不同的 MST,如果 O(h(n,m)) 限定时间以找到 G 的 MST,则在时间 O(h(n,m)) 中。

我不知道类似的方法是否可以处理是否存在三个(或更多)不同的MST;它的简单扩展可以归结为简单的反例。

梁丘俊材
2023-03-14

假设您有一个图的MST<code>T0</code>。现在,如果我们可以得到另一个MST<code>T1</code>,它必须至少有一个不同于原始MST的边缘<code>E</code>。从T1中去掉E,现在图形被分成两个部分。然而,在T0中,这两个组件必须连接,因此这两个部件之间将有另一条边,其权重与E完全相同(或者我们可以用另一条替换权重更大的一条,从而获得更小的ST)。这意味着用E替换另一条边。将为您提供另一个MST。

这意味着如果有不止一个MST,我们总是可以从一个MST改变一个边,得到另一个MST。因此,如果您正在检查每个边,请尝试用相同权重的边替换边,如果您得到另一个ST,它是一个MST,您将获得更快的算法。

申黎明
2023-03-14

你可以修改克鲁斯卡尔的算法来做到这一点。

首先,按权重对边进行排序。然后,对于升序的每个权重,过滤掉所有不相关的边。相关边形成了迄今为止最小生成林的连通分量的图。您可以计算此图中生成树的数量。对所有权重进行乘积,您已经计算了图中最小生成树的总数。

如果您只关心一棵树、两棵树和三棵或更多树的情况,则可以恢复与 Kruskal 算法相同的运行时间。我认为您最终会进行行列式计算或其他东西来枚举生成树,因此您通常可能会遇到 O(MM(n)) 最坏情况。

 类似资料:
  • 赋权图G的最小瓶颈生成树是G的生成树,使得生成树中任何边的最大权值最小。MBST不一定是MST(最小生成树)。 请举例说明这些说法有意义的地方。

  • 假设我选择V(H)={a,e,f}和e(H)={ae,af,fe} 现在,对于每条边e∈e(H),我们用e'记下了(来自原始图G的) 达到这个最小值的边。所以E'={bc,df,eg},因为bc=4,df=9,eg=8,是连接我的元件的最小边。我在H中有一个相对于代价函数C′的最小生成树,而a′是这棵树的边集。 但是我的A'的边和E'的没有一条是一样的。

  • 我有一个问题需要我在Boost图库中找到一个有向图的最小生成树。 我的第一个尝试是使用深度优先搜索和dfs-visitor。我的计划是忽略除树边回调之外的所有边。这不起作用,我给出了下面的例子来说明原因。 我的问题是我是否可以让我的dfs-visitor在BGL中创建一个有向图的最小生成树。 下面是失败的例子。如果我有以下有向图 在深度优先搜索dfs-visitor中,1->0被分类为前沿。 如果

  • Source Code - 源码 Test Code - 测试 Breadth First Search(BFS) 广度优先搜索 问题: 用广度优先搜索从图(G)的节点(beg)开始,遍历图(G)中的所有节点。 解法: 在图(G)中,假设节点(i)的邻节点集合为(V_i),对于图中的任意节点(i),在访问节点(i)之后,总是优先访问该节点的邻节点集合(V_i)中的所有节点,然后才继续访问其他节点。

  • 问题 用广度优先搜索从图(G)的节点(beg)开始,遍历图(G)中的所有节点。 解法 在图(G)中,假设节点(i)的邻节点集合为(V_i),对于图中的任意节点(i),在访问节点(i)之后,总是优先访问该节点的邻节点集合(V_i)中的所有节点,然后才继续访问其他节点。 广度优先遍历需要一个队列(queue)来存储那些等待访问而尚未被访问的节点,在遍历过程中,为了避免重复的访问一个节点,当某个节点(i

  • 最小生成树英文是Minimum Spanning Tree,对于最小生成树大家应该都不陌生,当然还有最大生成树,首先就简单总结一下算法里的生成树。 一、什么是生成树? Spanning有跨越的意思,生成树一般来说每个节点都能访问到别的节点,是一个连通树。所以,一般考虑无向图里去造生成树。生成树又分最小和最大两种,其中最小生成树应用比较多。总结一下生成树的定义: 1. 首先它得是一个树的结构 2.