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 àn1n
Soit poids A du nombre d'arêtes iaii
Soit poids B du nombre d'arêtes ibii
Dresser ce tableau
|a_1 a_2 a_3 a_4 .. a_n
---+-------------------------
b_1|.........................
b_2|.........................
. |.........................
. |.........................
b_n|...................a_n * b_n
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
(2,11),(11,2),(4,6) n'est pas un contre-exemple.
a1=2,a2=11,a3=4
b1=11,b2=2,b3=6
alors
| 2 11 4
---+--------------------
11 | 22 121 44
2 | 4 22 8
6 | 12 66 24
(4,6)(2,11)(11,2)=44+8+24+66+12=154=22+4+12+121+44=203=121+22+66+4+8=221
(11,2) est supprimé.
Se retrouver avec(2,11),(4,6)=6∗17=102
D'autres arbres couvrant sont
(11,2),(4,6)=15∗12=180
(2,11),(11,2)=13∗13=169