Qu'est-ce qu'un bon algorithme pour obtenir la couverture vertex minimale d'un arbre?
Qu'est ce qu'un bon algorithme pour obtenir le minimum vertex cover d'un arbre?
D'ENTRÉE:
Le nœud voisin.
De SORTIE:
Le nombre minimum de sommets.
source d'informationauteur John Retallack
Vous devez vous connecter pour publier un commentaire.
J'espère ici vous pouvez trouver plus liés réponse à votre question.
Je pensais à ma solution, probablement vous aurez besoin de polir mais tant que la dynamique de programmation est dans l'une de vos étiquettes, vous aurez probablement besoin de:
taille du couvercle avec un sommet u et S-(u)
couvrir sans sommet u.
Après la lecture de cette. Changé l'algorithme ci-dessus pour trouver le maximum de réglages indépendants, puisque dans l'article wiki a déclaré
Donc en changeant de min à max, nous pouvons trouver le maximum de réglages indépendants et par complimenter le minimum vertex cover, puisque les deux problèmes sont équivalents.
T(V,E) est un arbre, ce qui implique que, pour toute feuille, tout minimale du vertex cover est d'inclure la feuille ou le sommet adjacent à la feuille. Cela nous donne l'algorithme suivant pour trouver S, le sommet de couverture:
Maintenant, il ne reste plus qu'à vérifier si l'arbre d'origine a un seul sommet, nous sommes de retour 1 et ne jamais démarrer la récursivité, et le peu de vertex cover peut être calculée.
Edit:
En fait, après y avoir réfléchi un peu, il peut être accompli avec un simple DFS variante.
Je n'ai pas bien compris après avoir lu les réponses ici, donc je pensais que je poste un de ici
L'idée générale est que vous la racine de l'arbre à l'arbitraire d'un nœud, et de vous demander si cette racine est dans le cache ou pas. Si c'est le cas, vous devez calculer le min vertex cover de la sous-arbres enracinés à ses enfants par recursing. Si elle ne l'est pas, ensuite, chaque enfant de la racine doit être dans le sommet de couverture, de sorte que chaque arête entre la racine et de ses enfants est couverte. Dans ce cas, vous recurse sur la racine de petits-enfants.
Ainsi, par exemple, si vous aviez l'arbre suivant:
Noter que, par l'inspection, vous savez le min vertex cover est
{B, C}
. Nous allons trouver ce min de couverture.Ici, nous commençons avec
A
.Un est dans le couvercle
Nous déplacer vers le bas pour les deux sous-arbres de
B
etC
et de manière récursive sur cet algorithme. Nous ne pouvons pas nous contenter de dire qu'B
etC
ne sont pas dans le cache, parce que même siAB
etAC
sont couverts, nous ne pouvons rien dire quant à savoir si nous aurons besoin deB
etC
être dans le cache ou pas.(Penser à l'arbre suivant, où à la fois la racine et l'un de ses enfants sont dans le min de couverture (
{A, D}
))
Un n'est pas dans le couvercle
Mais nous savons que
AB
etAC
doivent être couverts, alors nous devons ajouterB
etC
à la couverture. DepuisB
etC
sont dans la pochette, on peut répéter à leurs enfants au lieu de recursing surB
etC
(même si nous, il ne nous donne pas plus d'informations)."Officiellement"
Laisser
C(x)
être la taille de la min couvrir la racinex
.Puis,
Nous pouvons utiliser un DFS en fonction de l'algorithme pour résoudre ce problème:
Le nœud feuille ne sera jamais sélectionné pour le vertex cover.
Nous avons besoin de trouver le minimum vertex cover pour chaque nœud, nous avons à faire des choix, que ce soit pour l'inclure ou de ne pas l'inclure. Mais, selon le problème pour chaque arête (u, v), soit de " u "ou en" v " doit être dans le couvercle de sorte que nous devons prendre en charge que si le sommet n'est pas inclus nous nous devons de les inclure ses enfants, et si nous sommes, y compris les vertex ensuite, nous peut ou peut ne pas inclure ses enfants basé sur la solution optimale.
Ici, DP1[v] pour tout sommet v = Lorsque nous l'indiquer.
DP2[v] pour tout sommet v = quand on n'a pas l'inclure.
DP1[v] = 1 + somme(min(DP2[c], DP1[c])) - ce sont également des moyens actuels et peut ou peut ne pas inclure ses enfants, basée sur ce qui est optimal.
DP2[v] = sum(DP1[c]) - ce qui signifie pas de courants, alors nous avons besoin d'inclure les enfants de l'actuel sommet. Ici, c est l'enfant de vertex v.
Ensuite, notre solution est min(DP1[racine], DP2[root])
Je voudrais simplement utiliser un programme linéaire pour résoudre le minimum vertex cover problème.
Une formulation comme un programme linéaire en nombres entiers pourrait ressembler à celle donnée ici: Formulation ILP
Je ne pense pas que votre propre mise en œuvre serait plus rapide que ces très optimisé LP solveurs.