TL,DR:在增长MST时,如果有许多轻量级边可供选择,我该如何选择要添加到MST的特定边?
我有一个通用的问题,我一直试图解决这一整天,但是阅读我的算法书&在网上搜索并没有帮助我。我无法分享我的代码,因为它适用于大学项目,而且它基本上是我错过的唯一场景。
想象一下以下问题。
我有一个N边的图表,我想找到它的MST(典型的问题)。然而,除了具有将顶点u连接到顶点v的成本的边缘之外,那些相同的顶点可以具有特殊标记,这允许它们连接到具有相同特殊标记的所有其他边缘。
我回答了这个问题,通过创建一个特殊的顶点,所有带有该标志的顶点连接到该顶点,并带有相应的成本。
一切正常。当MST有许多可能的解决方案时,问题就出现了。我应该输出一个使用最少量的特殊标志连接。
我知道读者可能很难在不看我的代码的情况下提出建议。但不幸的是,我真的无法分享。
我可以说的是,我正在定义一个Edge,无论它是特殊的还是不是结构{u,v,cost}
我尝试过的一件事是按照标准kruskal算法的要求按重量新月顺序对边缘矢量进行排序,但每当重量相同时,推动边缘就是一个特殊的边缘"转发到矢量中。
所以我会有这样的事情 [费用1正常,费用1正常,费用1特价,费用2,费用3,费用3特价,......]。
任何想法?
感谢您的投入。
答案 0 :(得分:1)
我认为您所解释的内容似乎是正确的,但这是另一种解决问题的方法。
在构建MST时,您只需要比较与边缘相关的成本 - 您的代码不需要做任何非常复杂的成本。
因此,成本不一定是普通数字。它们可以有两个组件,一个用于通常的比较,一个用作第一个组件比较相等时的平局。另一种看待这种情况的方法是说所有成本看起来有点像123.000000000000000000000456,其中成本的第一部分和成本的第二部分之间有如此多的零,成本的第二部分永远不会在比较除非第一部分相等,并且从第二部分到第一部分从来没有任何进位。
所以在您的问题中,成本的第一部分是边的普通权重,如果是特殊边,则成本的第二部分为1,否则为0。在这种情况下,最低成本是最低普通成本,特殊边缘的数量用作决胜局。