MIN-Scheitelpunkt, um in einem Baum zuzugreifen
-
28-09-2020 - |
Frage
Ich muss die Mindestanzahl von $ N $ Scheitelpunkte auf einem Baum mit $ n-1 $ Kanten, so dass zumindest
Beispielsweise, wenn $ n= 9 $ und $ k= 6 $ und wir haben dasBaum:
generasacodicetagpre.Die richtige Antwort sollte $ \ mathrm {min}= 2 $ sein.
irgendwelche Gedanken?
Lösung
Es gibt einen
Rufen Sie eine Kante auf, wenn wir neben ihm einen Scheitelpunkt auswählen. Wurzeln Sie den Baum an einem beliebigen Vertex
Wenn wir diesen DP berechnen, können wir das Problem lösen, da die Mindestanzahl der Knoten zum Abdecken von $ K $ Kanten ist, ist der kleinste $ T $ für welches $ max (dp [r] [0] [t], dp [r] [1] [t]) \ geq k $ . Weiterhin beachten Sie, dass er ausreicht, um nur den
Um das Wiederauftreten zu berechnen, um den DP zu berechnen, geben wir zuerst die Knapsack-Funktion an: Lassen Sie $ k (v_ {1}, \ dots, v_ {m}) $ ein Array so sein, dass
\ beginnen {Gleichung *} K (v_ {1}, \ dots, v_ {m}) [t]=max_ {t_ {1} + \ dots + t_ {m}= t} \ sum_ {j= 1} ^ {m} v_ { j} [t_ {j}] \ \ end {Gleichung *}
Beachten Sie, dass $ k (k (v_ {1}, \ dots, v_ {m-1}), v_ {m})= k (v_ {1}, \ Punkte, v_ {m}) $ , und dass $ k (a, b) $ direkt von der obigen Formel in $ \ Mathcal {O} (| A | \ cdot | B |) $ Zeit. Somit berechnen $ k (v_ {1}, \ dots, v_ {m}) $ nimmt $ \ mathcal {o} (\ sum_ {i= 2} ^ {m} | v_ {i} | ^ {i-1} ^ {i-1} | v_ {j} |) $ Zeit unabhängig von der Bestellung, die wir kombinieren Die Sets in. Wenn wir uns an nur den ersten $ K $ Werte des DP interessieren, fällt die Komplexität auf $ \ mathcal {o} (\ sum_ {i= 2} ^ {m} | v_ {i} | \ min (k, \ sum_ {j= 1} ^ {i-1} | v_ {j} |)) $ < / span>
lass $ c_ {i} $ sein Set von Kindern des Knotens $ i $ , und
Andere Tipps
Eine einfache Lösung besteht darin, den Status $ dp (n, 2, n) $ zu verwenden. Lassen Sie $ dp (i, 0, j) $ Seien Sie die maximale Anzahl der Kanten, die wir mit $ \ leqj J erhalten können $ Knoten in dem Teilbaum, das bei Knoten $ I $ , mit Knoten $ I $ selbst nicht in der Scheitelpunktabdeckung sein. Lassen Sie $ dp (i, 1, j) $ dasselbe, außer dem Knoten $ I $ ist enthalten in der Scheitelpunktabdeckung.
Der Übergang selbst ist nicht offensichtlich, aber es kann mit einer knapsackähnlichen Methode erfolgen. Betrachten Sie alle Kinder des Knotens $ i $ . Verwenden Sie alle Werte von $ DP (CH, 0, C) $ und $ dp (CH, 1, C) $ $ als Elemente in zwei separaten Rucksacks: Eine zur Berechnung des vollständigen Arrays $ dp (i, 0) $ und eine, um das vollständige Array $ dp (i, 1) $ . Die Kosten für Elemente sind einheitlich $ C $ , während die Werte derzeit sind:
Wenn berechnet $ dp (i, 0) $ : Wert von $ dp (CH, 0, C) $ ist $ dp (CH, 0, C) $ ; Wert von $ DP (CH, 1, C) $ ist $ dp (CH, 1, c) + 1 $ < / span>.
Bei Berechnung der
Wir können die vollständigen Arrays $ dp (i, 0) $ und $ dp (i, 1) $ Direkt aus den Endwerten der Rucksäcke (dh die Werte von $ kN (last, j) $ für alle $ J $ ). Der Knapsack hat $ O (\ # Kinder * n) $ Elemente pro Knoten und läuft in $ O (\ # Kinder * n * n) $ pro Knoten. Daher ist die Gesamtkomplexität der Lösung
Ich blieb sicher, ob es Lösungen gibt, die in der Zeit schneller laufen als dieses, aber ich würde nicht daran zweifeln.