Considérons un graphe . Chaque arête a deux poids et . Trouvez un arbre couvrant qui minimise le produit . L'algorithme doit s'exécuter en temps polynomial par rapport à.
Je trouve difficile d'adapter l'un des algorithmes traditionnels sur les arbres couvrant (Kruskal, Prim, Edge-Deletion). Comment le résoudre? Des indices?
Réponses:
Je vais supposer que vous ne recevez pas de bords pondérés négatifs, car cela peut ne pas fonctionner s'il y a des poids négatifs.
Algorithme
Pour chacun de vos bords, étiquetez-les de àn1 n
Soit poids A du nombre d'arêtes iai i
Soit poids B du nombre d'arêtes ibi i
Dresser ce tableau
Chacun des éléments du tableau étant le produit d'une ligne et d'une colonne.
Pour chaque bord, additionnez la ligne et la colonne de tableau pertinentes (et n'oubliez pas de supprimer l'élément dans l'intersection car il a été additionné deux fois).
Trouvez l'arête qui a la plus grande somme, supprimez cette arête si elle ne déconnecte pas le graphique. Marquez le bord comme essentiel sinon. Si un bord a été supprimé, remplissez ses lignes et colonnes avec 0.
Exactitude
Le résultat est évidemment un arbre.
Le résultat s'étend évidemment car aucun sommet n'est déconnecté.
Le résultat est minime? S'il existe un autre bord dont la suppression créera un arbre couvrant plus petit à la fin de l'algorithme, ce bord aurait été supprimé et annulé en premier. (si quelqu'un pouvait m'aider à rendre cet exemple un peu plus rigoureux / et / ou contre, ce serait formidable)
Durée
Évidemment polynomial dans.|V|
Éditer
alors
Se retrouver avec(2,11),(4,6)=6∗17=102
D'autres arbres couvrant sont
la source
Il s'agit de la solution de http://www.cnblogs.com/autsky-jadek/p/3959446.html .
Nous pouvons voir chaque arbre couvrant comme un point dans le plan , où est la somme des poids , y est la somme des poids . Le but est de minimiser .x−y x ∑e∈TAe ∑e∈TBe xy
Trouvez l'arbre minimum en fonction du poids et le poids . Nous avons donc deux points dans le plan xy . Dans tous les points d'arbre couvrant dans le plan, a le minimum , a le minimum .A B A,B A x B y
Maintenant, nous cherchons à trouver un point dans le triangle qui a la distance maximale à la ligne , afin que nous puissions avoir la valeur pour minimisée pour tous les points du triangle .C OAB AB xy C ABC
Parce que .2SABC=|AB−→−×AC−→−|=(Bx−Ax,By−Ay)×(Cx−Ax,Cy−Ay)=(Bx−Ax)⋅Cy+(Ay−By)⋅Cx−Ay(Bx−Ax)+Ax(By−Ay)
Notez que est une constante, alors maintenant nous visons à maximiser . Nous donc un nouveau graphe , tandis que le poids . Maintenant, nous un arbre couvrant maximum sur pour obtenir le point . ( B x - A x )⋅ CAy(Bx−Ax)+Ax(By−Ay (Bx−Ax)⋅Cy+(Ay−By)⋅Cx G′=(V,E) w(e)=Be(Bx−Ax)+Cx(Ay−By) G′ C
Exécutez l'algorithme ci - dessus sur récursive, jusqu'à ce qu'il n'y a plus d' arbres couvrant entre et .B C , A C OOBC,OAC BC,AC O
Nous obtenons maintenant un ensemble d'arbres couvrant possibles. Calculez la valeur pour chaque arbre pour obtenir l'arbre minimum.xy
la source