除了寻找MST之外,Prim和Kruskal的应用

时间:2015-08-01 11:22:43

标签: algorithm graph prims-algorithm kruskals-algorithm

我在codechef中看到一个问题,其目标是从图形中选择边缘,使得所选边缘不形成循环,并且所有选定边缘的权重乘积也是最大的。在编辑中给出了prim&# 39; s和kruskal算法在这里工作。实际上,它给出了它可以最大化边缘的任何对称单调函数。 那么究竟什么是对称单调函数以及我们在哪里可以使用这种算法。

1 个答案:

答案 0 :(得分:2)

我猜作者的意思如下:

如果生成树上的最终得分是f(w1, w2, ... wn),其中wi是边权重,那么f在权重中应该是单调的。这意味着,如果你增加任何权重,f将总是增加(单调增加)或总是减少(单调减少)。总和和产品都是单调递增的:

f_sum (w1, w2, ... wn) = w1 + w2 + ... + wn
f_prod(w1, w2, ... wn) = w1 * w2 * ... * wn //non-negative-weights

对称是指订单。如果您可以确保f,则f(..., wi, ..., wj, ...) = f(..., wj, ..., wi, ...)是对称的。应该清楚为什么需要这样做。任何MST算法应该只关心选择什么边缘而不关心它们的顺序。 sum和product都是可交换操作,因此是对称的。

这可行的原因是因为给定图形的所有生成树具有相同的边数。如果您贪婪地采用最大可用边(对于单调递增函数)或最小边(对于单调递减函数),您将自动最大化f

我所知道的大多数应用程序都是MST的应用程序(主要用于近似最佳解决方案)。就概率模型而言,最大乘积可以指最大化最终概率,其中边表示随后组合的单独事件的概率。我没有偶然发现任何其他的生成树构造功能。