我在codechef中看到一个问题,其目标是从图形中选择边缘,使得所选边缘不形成循环,并且所有选定边缘的权重乘积也是最大的。在编辑中给出了prim&# 39; s和kruskal算法在这里工作。实际上,它给出了它可以最大化边缘的任何对称单调函数。 那么究竟什么是对称单调函数以及我们在哪里可以使用这种算法。
答案 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的应用程序(主要用于近似最佳解决方案)。就概率模型而言,最大乘积可以指最大化最终概率,其中边表示随后组合的单独事件的概率。我没有偶然发现任何其他的生成树构造功能。