Algorithm 一个算法,看看一个图中是否正好有两个MST?

Algorithm 一个算法,看看一个图中是否正好有两个MST?,algorithm,minimum-spanning-tree,Algorithm,Minimum Spanning Tree,我有一个无向连通图G。我希望找到一个算法,如果至少有2个MST,该算法返回true 如果我想知道是否有2个MST呢?我知道确定不同生成树数量的算法:这使用了基尔霍夫定理。我记得我解决了关于最小树数的问题,但若我没记错的话,它是指数型的。主要思想是测试树中使用的边的位掩码,包括排除方法 顺便说一下,如果所有边的权重都不同,那么只有一个MST。希望有帮助。通过修改Kruskal算法,我们可以有效地检测这两种情况。如果有人能想出一个更简单的方式来描述这一切,请让我知道 Kruskal为等重边的每个排列

我有一个无向连通图G。我希望找到一个算法,如果至少有2个MST,该算法返回true


如果我想知道是否有2个MST呢?

我知道确定不同生成树数量的算法:这使用了基尔霍夫定理。我记得我解决了关于最小树数的问题,但若我没记错的话,它是指数型的。主要思想是测试树中使用的边的位掩码,包括排除方法


顺便说一下,如果所有边的权重都不同,那么只有一个MST。希望有帮助。

通过修改Kruskal算法,我们可以有效地检测这两种情况。如果有人能想出一个更简单的方式来描述这一切,请让我知道

Kruskal为等重边的每个排列构建MST Kruskal算法通过始终包含连接到目前为止已构建的林的不同组件的次最小边来构建MST。只要选择任何此类最小边,即无论具有相等权重的边如何排序,该算法都是正确的

克鲁斯卡尔可以找到每一个MST 此外,每个MST都可以通过选择某种特定的方式对每组等权边进行排序,然后运行Kruskal算法来生成。要了解这一点,假设有一些MST不能以这种方式生成。现在从该MST中每条边的权重中减去少量ε(小于任何一对不等边权重之间的差值):该MST现在是唯一的MST,因此Kruskal在使用新边权重运行时必须生成该MST。但因为我们最多只调整了epsilon的边,当边按权重排序时,具有权重w_i-epsilon的所有边集必须(以某种顺序)出现在具有权重w_i的边集(以某种顺序)的前面,两组之间没有其他边。但是,对于原始的、未修改的边,这是一个有效的可能排序,Kruskal算法只关心边的排序,而不关心它们的特定权重,因此Kruskal算法也必须根据该排序生成MST。这与我们的假设相矛盾,因此必须是Kruskal算法可以生成每个MST

分量图 在i>=0边添加步骤F(i)之后调用Kruskal算法构建的林,剩余的边将被考虑,并且不会创建循环R(i)。(当在步骤i中添加一条边时,我们从R(i-1)的副本开始,删除刚添加的边和连接同一对组件的所有其他边,形成R(i)。尽管Kruskal算法实际上“惰性地”消除了这些其他边,但通过这种方式定义R(i)简化了算法属性的证明。)我们将把Kruskal算法分解为一系列块,每个块都由一系列的边添加组成,在这些边添加相同权重的边。如果i=0或R(i)中的最小权重边大于步骤1中添加的任何边,则调用i块定义。。一,

假设在已执行Kruskal算法的边添加步骤中的某个块定义数i>=0之后,R(i)中的最小边(即不会创建循环的下一最小边)具有权重w。Kruskal算法将在执行任何其他操作之前,以某种方式将所有具有权重-w边的树连接在一起,即使为这些等权重边选择不同的边顺序可能会影响生成的树,但不会影响每个树中的顶点集。更准确地说:

定义一个新的未加权多重图(即,在一对顶点之间可以有多条边的图)C(i),该图由森林F(i)中每个组件(树)的一个顶点组成。对于C(i)中的任何顶点v,将t(v)称为F(i)中对应于v的树。只要t(u)中的某个顶点和t(v)中的某个顶点之间的R(i)中存在权重w边,就在C中的两个顶点u和v之间创建一条边。在i步之后调用C(i)组件图


引理:假设对于定义数字i的某些块,C(i)有k个至少包含1条边的组件(即不是单个顶点的组件),并且在这些组件中,总共有m>=2k个顶点。调用这组顶点M。然后,无论等重边的排序如何,在Kruskal算法的M-k多个边添加步骤之后,与M中的顶点对应的M棵树将合并为k棵树,其中第J棵树由与C(i)的第J个分量的顶点对应的树的并集组成,加上一条或多条权重为w的边,对于每一条边,俄罗斯源algo基于Kirchoff定理在多重图上工作。棒极了@伊姆斯拉夫科:如果你想知道MST的确切数量,这很有用。谢谢:)