我们对算法有以下输入:
没有周期(也就是生成树)的图G
,其中每个节点都有一个相关的权重。
我想找到一个独立的集合S
,以便:
S
中没有两个元素在G
S[0] + S[1] + ... + S[n-1]
(len(S)==n
)。这是我到目前为止的高级伪代码:
MaxWeightNodes(SpanningTree S):
output = {0}
While(length(S)):
o = max(node in S)
output = output (union) o
S = S \ (o + adjacentNodes(o))
End While
Return output
有人可以告诉我我是否犯了错误,或者这个算法会给我我想要的结果吗?
答案 0 :(得分:5)
该算法无效,因为当您排除初始最大值的相邻节点可能是最佳本地解决方案时,您将很快遇到这种情况,但不是最佳的全局决策。
例如,output = []
:
10
/ \
100 20
/ \ / \
80 90 10 30
output = [100]
:
x
/ \
x 20
/ \ / \
x x 10 30
output = [100, 30]
:
x
/ \
x x
/ \ / \
x x 10 x
output = [100, 30, 10]
:
x
/ \
x x
/ \ / \
x x x x
虽然我们知道有更好的解决方案。
这意味着你没有optimal substructure的贪婪算法。
答案 1 :(得分:2)
我认为顶点的权重使得贪婪的解决方案变得困难。如果所有权重相等,您可以尝试选择树的一组级别(对于完整的k-ary树,这显然是最简单的,但是生成树通常不属于该类)。也许将贪婪近似视为具有组合权重的级别是有用的,因为您总是可以选择树的同一级别的所有顶点(独立于您根据它的哪个顶点)进入相同的独立组;在同一级别的两个顶点之间不能有边。我不提供解决方案,因为这对我来说似乎是一个难题。主要问题似乎是权重和事实,你不能假设你正在处理完整的树木。
编辑:实际上,总是选择一个级别的所有顶点似乎也是一个坏主意,因为鲁本斯的例子有助于可视化;想象一下,他树右边第二层的顶点重量为200。