Algoritmo di Edmonds: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
Riga 4:
== Descrizione ==
L'algoritmo accetta in ingresso un grafo orientato e pesato ''G'' = ''(V,A,w,a)'', dove ''V'' è l'insieme dei nodi, ''A'' l'insieme degli archi, ''w: A'' → ''R<sup>+</sup>'' una funzione dall’insieme degli archi all’insieme dei numeri reali e ''a'' il nodo che si richiede essere radice dell'albero. In uscita restituisce l'albero orientato di supporto a costo minimo ''T* = (V,A*,w,a)'', dove ''A*'' è un sottoinsieme di ''A'' formato da ''card(V ) - 1'' archi. Durante l’esecuzione l’algoritmo opera su grafi intermedi ''G<sub>i</sub> = (V,A<sub>i</sub>,w,a)'' e su alberi intermedi ''
All'inizio vengono eliminati gli archi entranti nella radice ''a'', evidentemente estranei all'albero richiesto. Successivamente
Consideriamo la
;'''passo 1.''': Per ogni nodo si seleziona l'arco entrante di peso inferiore. Dal momento che la radice non ha archi entranti, rimangono ''card(V ) - 1'' archi. Se non ci sono cicli
;'''passo 2'''.: Se ci sono cicli si procede a considerarli secondo un ordine qualsiasi:
:::'''a.''' Ulteriori eventuali archi del grafo di partenza che congiungono i nodi del ciclo sono eliminati dall’insieme degli archi.
Riga 19:
:::'''d.''' Tra tutti gli archi rietichettati e paralleli che entrano in un super-nodo si conserva quello di peso inferiore e si eliminano tutti gli altri.
:::'''e.''' Si ripete questo procedimento per ogni ciclo.
;'''passo 3.''': Torniamo al passo 1 e applichiamo la manovra di contrazione sul grafo ridotto ''G<sub>i+1</sub>'' ottenuto
Consideriamo ora la
;'''passo 1.''': Consideriamo un super-nodo e l'arco entrante, l'arco entrante appartiene alla soluzione finale ''T* = (V,A*,w,a)'' e viene etichettato come era in origine.
;'''passo 2.''': Il super-nodo viene espanso nei nodi originali e tra gli archi del ciclo bisogna eliminarne uno; tra i nodi del ciclo uno ha due archi entranti: l'arco appena aggiunto alla soluzione e l'arco del ciclo, quest'ultimo viene eliminato, gli altri archi del ciclo vengono aggiunti alla soluzione.
;'''passo 3.''': Si torna al passo 1 finché abbiamo espanso tutti i super-nodi.
Riga 38 ⟶ 39:
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 1
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 2.a
|-
|[[Image:Kruskal Algorithm 3.svg|200px]]
|Prima manovra di contrazione: passo 2.b
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 2.c
|-
|[[Image:|200px]]
|Seconda manovra di contrazione: passo 1
|-
|[[Image:|200px]]
|Seconda manovra di contrazione: passo 2.a
|-
|[[Image:|200px]]
|Seconda manovra di contrazione: passo 2.b
|-
|[[Image:|200px]]
|Seconda manovra di contrazione: passo 2.c
|-
|[[Image:|200px]]
|Seconda manovra di contrazione: passo 2.d
Fine fase di contrazione
|-
|[[Image:|200px]]
|Prima manovra di espansione: passo 1
|-
|[[Image:|200px]]
|Prima manovra di espansione: passo 2
|-
|[[Image:|200px]]
|Seconda manovra di espansione: passo 2
Fine
Si ottiene ''T* = (V,A*,w,a)''.
|}
Riga 87 ⟶ 90:
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 1
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 2.a
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 2.b
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 2.c
|-
|[[Image:|200px]]
|Prima manovra di contrazione: passo 2.d
|-
|[[Image:|200px]]
|Seconda manovra di contrazione: passo 1
Gli archi selezionati non formano cicli: abbiamo trovato un albero.
Fine fase di contrazione
|-
|[[Image:|200px]]
|Prima manovra di espansione: passo 1
|-
|[[Image:|200px]]
|Prima manovra di espansione: passo 2
|-
|[[Image:|200px]]
|Seconda manovra di espansione: passo 1
|-
|[[Image:|200px]]
|Seconda manovra di espansione: passo 2
|-
|[[Image:|200px]]
|Fine
Si ottiene ''T* = (V,A*,w,a)''.
|}
|