我不想找到所有的最小生成树,但我想知道它们有多少,下面是我考虑的方法:
- 使用prim或kruskal算法找到一个最小生成树,然后找到所有生成树的权重,当它等于最小生成树的权重时,递增运行计数器
我找不到任何方法来找到所有生成树的权重,而且生成树的数量可能很大,所以这种方法可能不适合这个问题。由于最小生成树的数量是指数级的,所以对它们进行计数不是一个好主意。
- 所有权重都将为正
- 我们还可以假设,没有权重会在图中出现三次以上
- 顶点的数量将小于或等于40000
- 边的数量将小于或等于100000
图中只有一个最小生成树,其中顶点的权重不同。我认为找到最小生成树的数量的最好方法一定是使用这个属性。
编辑:
我找到了这个问题的解决方案,但我不确定它为什么有效。谁能解释一下吗?
解决方案:最小生成树的长度问题是众所周知的;求最小生成树的两个最简单的算法是Prim算法和Kruskal算法。在这两个边中,Kruskal的算法按边权重的递增顺序处理边。然而,Kruskal算法有一个重要的关键点需要考虑:当考虑按权重排序的边列表时,边可以贪婪地添加到生成树中(只要它们不连接已经以某种方式连接的两个顶点)。
现在考虑使用Kruskal算法的部分形成的生成树。我们已经插入了一些长度小于N的边,现在必须选择几个长度为N的边。算法规定,如果可能的话,我们必须在长度大于N的任何边之前插入这些边。然而,我们可以按任何顺序插入这些边。还要注意,无论我们插入哪条边,它都不会改变图的连通性。(让我们考虑两个可能的图,一个有从顶点A到顶点B的边,另一个没有。第二个图必须有A和B作为同一连接组件的一部分;否则,从A到B的边将插入一点。)
这两个事实加在一起意味着,我们的答案将是使用Kruskal算法插入长度为K的边(对于K的每个可能值)的方法数量的乘积。由于任何长度的边最多有三条,因此不同的情况可以是强制的,并且可以在每个步骤之后像正常情况一样确定连接的组件。
看看Prim的算法,它说要重复添加具有最低权重的边。如果有多个边具有可以添加的最低权重,会发生什么?选择一棵树可能会产生与选择另一棵树不同的结果。
如果你使用prim的算法,并将其作为起始边对每条边运行,同时锻炼你遇到的所有联系。然后你会有一个森林,包含Prim算法能够找到的所有最小生成树。我不知道这是否等于包含所有可能的最小生成树的森林。
这仍然可以归结为找到所有的最小生成树,但我看不到简单的方法来确定不同的选择是否会产生相同的树。
MST及其在图中的计数得到了很好的研究。例如,请参见:http://www14.informatik.tu-muenchen.de/konferenzen/Jass08/courses/1/pieper/Pieper_Paper.pdf.