頂点の重みがその次数であるツリーを扱う既存の質問がありますが、頂点が任意の重みを持つことができる場合に興味があります。
これは宿題ではありませんが、現在読んでいるアルゴリズム設計マニュアルの質問の 1 つです。回答セットは次のように解を与えます
- DFS を実行し、各ステップで Score[v][include] を更新します。v は頂点で、include は true または false です。
- v がリーフの場合、Score[v][false] = 0、Score[v][true] = w vを設定します。ここで、w vは頂点 v の重みです。
- DFS 中に、ノード v の最後の子から上に移動するときに、Score[v][include] を更新します。 Score[v][false] = Score[c][true] と Score の children(v) の c の合計[v][true] = w v + min(Score[c][true]; Score[c][false]) の children(v) の c の合計
- スコアをバックトラックして実際のカバーを抽出します。
ただし、実際にそれを機能するものに変換することはできません。(コメントへの回答:これまでに試したことは、「実際のカバーを抽出する」部分が透明ではないステップ4まで、重みを使用していくつかの小さなグラフを紙に描き、アルゴリズムを紙に実行することです。)
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}
で、隣接しています。混乱させるべきではないかもしれませんが、率直に言って、私は混乱しています。