J'essaie de trouver une méthode efficace pour détecter si un graphe donné G a deux arbres de recouvrement minimal différents. J'essaie également de trouver une méthode pour vérifier si elle a 3 différents arbres couvrant minimal. La solution naïve à laquelle j'ai pensé consiste à exécuter l'algorithme de Kruskal une fois et à trouver le poids total de l'arbre couvrant minimal. Plus tard, en supprimant un bord du graphique et en exécutant à nouveau l'algorithme de Kruskal et en vérifiant si le poids du nouvel arbre est le poids de l'arbre couvrant minimal d'origine, et donc pour chaque bord du graphique. Le runtime est O (| V || E | log | V |) qui n'est pas bon du tout, et je pense qu'il y a une meilleure façon de le faire.
Toute suggestion serait utile, merci d'avance
Réponses:
Kapoor & Ramesh (version SIAM J. Comput appropriée , gratuite (?) Du site Web personnel ) fournit un algorithme pour énumérer tous les arbres couvrant minimum dans les graphiques pondérés et non pondérés.
Ma compréhension de l'idée de base est que vous commencez avec un MST, puis permutez les bords qui se trouvent le long des cycles dans le graphique (donc tant que les poids sont corrects, vous remplacez un bord par un autre qui, vous le savez, reconnectera l'arbre) .
Pour le cas pondéré, ils donnent un temps d'exécution pour répertorier tous les arbres couvrant minimum de où N est le nombre de ces arbres couvrant. Il les énumère par ordre croissant de poids, et ma compréhension actuelle (superficielle) suggère qu'il est parfaitement possible de terminer l'algorithme après avoir généré un nombre donné d'arbres (car il commence simplement par le MST et les produit séquentiellement).O ( N⋅ | V| ) N
la source
On peut montrer que l'algorithme de Kruskal peut trouver chaque arbre couvrant minimal; voir ici .
la source
Pour voir s'il y a plus d'un MST, considérons par exemple l'algorithme de Kruskal. La seule façon dont il pourrait construire différents MST est de laisser de côté les bords en en choisissant un autre quand il y en a plusieurs avec le même poids. Mais ces bords de même poids auraient pu être exclus car ils formaient un cycle avec des bords plus légers ...
Vous devez donc exécuter l'algorithme de Kruskal, et lorsqu'il y a plusieurs arêtes avec le même poids à considérer, ajoutez toutes celles qui peuvent être ajoutées sans créer de cycles. S'il reste un bord de ce poids, et qu'il ne ferme pas un cycle avec l'un des bords avec des poids inférieurs (qui ont été ajoutés auparavant), il y a plus d'un MST. Vérifier s'il y en a exactement 2 ou 3 ou plus, etc. semble beaucoup plus difficile ...
la source
Modification de l'algorithme de Kruskal: lors de la commande des bords, regroupez les bords avec un poids égal. Maintenant, au point où vous traitez les bords dans l'ordre, chaque fois que vous atteignez un nouveau cluster, vérifiez d'abord tous les bords séparément et supprimez du cluster ceux qui fermeraient un cycle, compte tenu de ce qui a été construit avant le cluster. Exécutez ensuite tous les bords restants du cluster en essayant maintenant de les ajouter au MST. Si l'un d'eux ferme un cycle, cela était nécessairement dû à d'autres bords du même cluster insérés auparavant, ce qui signifie que vous avez plusieurs MST.
Cette solution préserve la complexité de l'algorithme de Kruskal, seulement elle augmente le temps pour chaque bord traité.
la source