【发布时间】:2015-02-15 11:23:30
【问题描述】:
有一个existing question 处理树,其中顶点的权重是它的度数,但我对顶点可以具有任意权重的情况感兴趣。
这不是家庭作业,但它是我目前正在阅读的算法设计手册中的问题之一;答案集给出了解决方案
- 执行 DFS,在每一步更新 Score[v][include],其中 v 是顶点,include 为真或假;
- 如果 v 是叶子,则设置 Score[v][false] = 0,Score[v][true] = wv,其中 wv 是顶点v的权重。
- 在 DFS 期间,从节点 v 的最后一个子节点向上移动时,更新 Score[v][include]: Score[v][false] = Score[c][true] 和 Score[v][true] 中 c 的总和 (v) = wv + 孩子中 c 的总和 (v ) 的 min(Score[c][true];Score[c][false])
- 通过回溯 Score 提取实际封面。
但是,我实际上无法将其转化为有效的东西。 (回应评论:到目前为止,我尝试的是绘制一些带有权重的小图并在纸上运行算法,直到第四步,其中“提取实际封面”部分不透明。)
作为回应阿里的回答:所以假设我有这个图,由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},它们是相邻的。也许这不应该令人困惑,但坦率地说,我很困惑。
【问题讨论】:
-
展示您迄今为止尝试过的内容,或就您不理解的算法部分提出具体问题。
标签: algorithm graph tree dynamic-programming vertex-cover