给定一个加权有向图 G(V,E)
,需要找出每个最小生成树中属于的边数以及属于至少一个但不是全部最小生成树的边的数量以及不属于任何最小生成树的边的数量。
输入的图以以下形式给出(示例):
3 3
1 2 1 ->edge(1,2),weight=1
1 3 1
2 3 1
第一个3
是节点数,第二个3
是边数。接下来的三行是边,第一个数字代表起点,第二个数字代表终点,第三个数字代表权值。
我考虑运行Kruskal算法一次以找到最小生成树(MST),然后对于每条属于G
的边,在(linear?)时间内检查它是否可以替换掉MST中的一条边而不改变总权重。如果不能,则它不属于任何MST;如果可以,则它属于其中一个但不是所有MST。我还可以标记第一个MST中的边(也许用第二个值1或0),最后检查有多少边无法替换。这些边属于所有可能的MST。
这个算法的时间复杂度可能是O(V^2)
,我不太确定如何在C++中编写它。我的问题是,我们能否以某种方式降低其复杂度?
如果我将边添加到MST中,如何检查(并在C++中实现)形成的环是否包含权值更小的边?
E
的子集吗?如果是这样,那么生成树中的边数与实际边集无关(即为|V|-1
),详见此处。 - Codor