web-dev-qa-db-fra.com

Comment trouver un arbre couvrant maximum?

Est-ce que l'opposé de l'algorithme de Kruskal pour un arbre couvrant minimum fonctionne pour lui? Je veux dire, choisir le poids maximum (Edge) à chaque étape?

Une autre idée pour trouver un arbre couvrant maximum?

50
user467871

Oui.

Une méthode de calcul du poids maximal couvrant un réseau G - due à Kruskal - peut être résumée comme suit.

  1. Triez les bords de G par ordre décroissant de poids. Soit T l'ensemble des arêtes comprenant l'arbre couvrant le poids maximum. Réglez T = ∅.
  2. Ajoutez le premier Edge à T.
  3. Ajoutez le bord suivant à T si et seulement s'il ne forme pas de cycle dans T. S'il n'y a plus de bords, quittez et signalez que G doit être déconnecté.
  4. Si T a n − 1 arêtes (où n est le nombre de sommets en G) arrêtez et sortez T. Sinon, passez à l'étape 3.

Source: https://web.archive.org/web/20141114045919/http://www.stats.ox.ac.uk/~konis/Rcourse/exercise1.pdf .

58
systemkern

De ce site Web:

"Un arbre couvrant maximum est un arbre couvrant d'un graphique pondéré ayant un poids maximum. Il peut être calculé en annulant les poids pour chaque Edge et en appliquant l'algorithme de Kruskal (Pemmaraju et Skiena, 2003, p. 336)."

36
Tony The Lion

Si vous inversez le poids sur chaque bord et minimisez, obtenez-vous le maximum d'arbre couvrant? Si cela fonctionne, vous pouvez utiliser le même algorithme. Bien entendu, le poids nul sera un problème.

6
duffymo

Bien que ce fil soit trop ancien, j'ai une autre approche pour trouver le spanning tree maximum (MST) dans un graphe G = (V, E)

Nous pouvons appliquer une sorte d'algorithme de Prim pour trouver le MST. Pour cela, je dois définir la propriété de coupe pour l'arête pondérée maximale.

Propriété de coupe: Disons à tout moment que nous avons un ensemble S qui contient les sommets qui sont en MST (pour l'instant, supposons qu'il soit calculé d'une manière ou d'une autre). Considérons maintenant l'ensemble S/V (sommets qui ne sont pas en MST):

Réclamation: Le bord de S à S/V qui a le poids maximum sera toujours dans chaque MST.

Preuve: Disons qu'à un moment où nous ajoutons les sommets à notre ensemble S, le bord maximal pondéré de S à S/V est e = (u, v) où u est dans S et v est dans S/V. Considérons maintenant un MST qui ne contient pas e. Ajoutez l'Edge e au MST. Il créera un cycle dans le MST d'origine. Parcourez le cycle et trouvez les sommets u 'dans S et v' dans S/V de telle sorte que u 'soit le dernier sommet dans S après quoi nous entrons S/V et v' est le premier sommet dans S/V sur le chemin dans cycle de u à v.

Supprimez le bord e '= (u', v ') et le graphique résultant est toujours connecté, mais le poids de e est supérieur à e' [comme e est le bord pondéré maximum de S à S/V à ce stade], donc ce résulte en un MST qui a une somme de poids supérieure au MST d'origine. C'est donc une contradiction. Cela signifie que Edge e doit être dans chaque MST.

Algorithme pour trouver MST:

 Commencer à partir de S = {s} // s est le sommet de départ 
 Tandis que S ne contient pas tous les sommets 
 Faire 
 {
 Pour chacun sommet s dans S 
 ajouter un sommet v de S/V de telle sorte que le poids de l'arête e = (s, v) soit maximum 
} 
 fin tandis que 

Implémentation: nous pouvons implémenter en utilisant Max Heap/Priority Queue où la clé est le poids maximum de l'Edge d'un sommet en S à un sommet en S/V et la valeur est le sommet lui-même. L'ajout d'un sommet dans S est égal à Extract_Max du tas et à chaque Extract_Max change la clé des sommets adjacents au sommet qui vient d'être ajouté.

Il faut donc m opérations Change_Key et n opérations Extract_Max.

Extract_Min et Change_Key peuvent tous deux être implémentés dans O (log n). n est le nombre de sommets.

Cela prend donc O (m log n) temps. m est le nombre d'arêtes dans le graphique.

4
Imran

Nier le poids du graphique d'origine et calculer l'arbre couvrant minimum sur le graphique négatif donnera la bonne réponse. Voici pourquoi: Pour le même arbre couvrant dans les deux graphiques, la somme pondérée d'un graphique est la négation de l'autre. Ainsi, l'arbre couvrant minimum du graphique annulé devrait donner l'arbre couvrant maximum de celui d'origine.

1
Shen Yang

Le fait d'inverser uniquement l'ordre de tri et de choisir un bord lourd dans une coupe de sommet ne garantit pas une forêt maximale (l'algorithme de Kruskal génère une forêt, pas un arbre). Dans le cas où toutes les arêtes ont des poids négatifs, la forêt couvrant maximum obtenue à partir de l'inverse du kruskal, serait toujours un chemin de poids négatif. Cependant, la réponse idéale est une forêt de sommets déconnectés. soit une forêt de | V | arbres singleton, ou | V | composants ayant un poids total de 0 (pas le moins négatif).

1
Sojourner

Permettez-moi de fournir un algorithme d'amélioration:

  • construire d'abord un arbre arbitraire (en utilisant BFS ou DFS)
  • puis choisissez un bord à l'extérieur de l'arbre, ajoutez-le à l'arbre, il formera un cycle, déposez le bord le plus petit du cycle.
  • continuer à faire cela utilise tous les bords restants sont considérés

Ainsi, nous obtiendrons l'arbre maximal couvrant.


Cet arbre satisfait tout bord en dehors de l'arbre, s'il est ajouté formera un cycle et le bord extérieur <= tout poids de bord dans le cycle

En fait, il s'agit d'une condition nécessaire et suffisante pour qu'un arbre couvrant soit un arbre couvrant maximal.

Pf.

Nécessaire: il est évident que cela est nécessaire, ou nous pourrions échanger Edge pour créer un arbre avec une plus grande somme de poids Edge.

Suffisant: Supposons que l'arbre T1 satisfasse à cette condition et T2 est l'arbre maximal s'étendant.

Ensuite, pour les arêtes T1 ∪ T2, il y a des arêtes T1 uniquement, des arêtes T2 uniquement, des arêtes T1 we T2, si nous ajoutons une arête T1 uniquement (x1, xk) à T2, nous savons que cela formera un cycle, et nous affirmons que dans ce cycle, il doit exister un seul bord T2 qui a les mêmes poids de bord que (x1, xk) . Ensuite, nous pouvons échanger ces bords produira un arbre avec un plus Edge en commun avec T2 et a la même somme de poids Edge, en répétant cela, nous obtiendrons T2. donc T1 est également un arbre couvrant maximum.

Prouvez la réclamation:

supposons que ce ne soit pas vrai, dans le cycle, nous devons avoir un Edge uniquement T2 puisque T1 est un arbre. Si aucun des bords T2 uniquement n'a une valeur égale à celle de (x1, xk), alors chacun des bords T2 uniquement fait une boucle avec l'arbre T1, puis T1 a une boucle conduit à une contradiction.

enter image description here


Cet algorithme est tiré des notes du professeur UTD R. Chandrasekaran. Vous pouvez vous référer ici: flux multi-terminaux de produits uniques

1
XueYu