Le graphique comporte deux / trois arbres de portée minimale différents?


15

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


Ce serait bien d'être conscient d'un tel algorithme, mais cela ne résoudra pas ce problème actuel
itamar

2
Le graphe aura un arbre couvrant minimal unique si et seulement si (1) pour toute partition de V ( G ) en deux sous-ensembles, le bord de poids minimum avec un point final dans chaque sous-ensemble est unique, et (2) le poids maximum bord dans tout cycle de G est unique. GV(G)g
Juho

Ces questions un et deux répondent-elles déjà à votre question?
Juho

Voir le problème 23-1 dans CLRS pour savoir comment trouver le deuxième meilleur MST en . O(n2)
Kaveh

Réponses:


7

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 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


Dans cette situation, nous aimerions abandonner l'algorithme tôt une fois que nous savons qu'il existe plus de solutions. L'algorithme le permet-il? k
Raphael

1
@Raphael, je n'ai pas eu le temps de vraiment m'y attaquer (yay marquage d'affectation), mais d'après ma compréhension approximative, cela devrait être possible - cela commence avec du MST, puis en génère d'autres un par un.
Luke Mathieson

1
@SaeedAmiri: "Le nombre de tels travées " signifie "le nombre de travées minimales ", et non "le nombre de travées". Si tous les arbres couvrant sont des arbres couvrant minimum, alors le graphique d'entrée est complet et tous les bords ont un poids égal. nn-2
JeffE

1
O(|V|)

1
Après une lecture rapide, l'algorithme pondéré génère les arbres dans un ordre de poids croissant (à partir d'un MST évidemment). Il devrait donc en être ainsi aux fins du PO.
Luke Mathieson

2

On peut montrer que l'algorithme de Kruskal peut trouver chaque arbre couvrant minimal; voir ici .

kk


5
kkK1,5

@vonbrand Bon point. Nous pouvons continuer à terminer toutes les branches du calcul, bien sûr, mais le temps d'exécution est déterminé par le nombre d'arbres couvrant, qui peut être exponentiel.
Raphael

1

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 ...


0

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é.


Vous semblez prétendre que vous pouvez traiter un cluster entier en temps constant mais je ne vois pas de constante évidente sur la taille d'un cluster. Pourriez-vous donner plus de détails sur la façon dont cette étape se déroule?
David Richerby
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.