存在一个处理树的问题,其中顶点的权重是它的度数,但我对顶点可以具有任意权重的情况感兴趣。
这不是家庭作业,但它是我目前正在阅读的算法设计手册中的问题之一;答案集给出了解决方案
- 执行 DFS,在每一步更新 Score[v][include],其中 v 是一个顶点,include 是真或假;
- 如果 v 是叶子,设置 Score[v][false] = 0, Score[v][true] = w v,其中 w v是顶点 v 的权重。
- 在DFS期间,当从节点v的最后一个子节点向上移动时,更新Score[v][include]:Score[v][false] = Sum for c in children(v) of Score[c][true] and Score [v][true] = w v + 子项中 c 的总和 (v) of min(Score[c][true]; Score[c][false])
- 通过回溯分数提取实际覆盖。
但是,我实际上无法将其转化为有效的东西。(回应评论:到目前为止,我尝试的是绘制一些带有权重的小图并在纸上运行算法,直到第四步,其中“提取实际封面”部分不透明。)
作为回应阿里的回答:所以假设我有这个图,由A
等给出的顶点和括号中的权重:
A(9)---B(3)---C(2)
\ \
E(1) D(4)
正确答案是明确的{B,E}
。
通过这个算法,我们会像这样设置值:
score[D][false] = 0
;score[D][true] = 4
score[C][false] = 0
;score[C][true] = 2
score[B][false] = 6
;score[B][true] = 3
score[E][false] = 0
;score[E][true] = 1
score[A][false] = 4
;score[A][true] = 12
好的,所以,我的问题基本上是,现在呢?做简单的事情并遍历score
向量并确定本地最便宜的东西是行不通的;你最终只会包括B
. 基于父级和交替进行决定也不起作用:考虑权重为的E
情况1000
;现在正确答案是{A,B}
,并且它们是相邻的。也许这不应该令人困惑,但坦率地说,我很困惑。