Nella teoria dei grafi l'algoritmo di Edmonds, chiamato anche algoritmo di Chu-Liu-Edmonds, è utilizzato per determinare, a partire da un dato digrafo pesato e fortemente connesso, un suo sottoalbero orientato di peso minimo e avente assegnata radice. L'algoritmo individua cioè un sottoinsieme degli archi del dato digrafo che costituisca un albero tale che ogni coppia dei nodi presi in considerazione sia connessa attraverso un cammino orientato e tale che il peso totale degli archi individuati risulti minimo. Una prevedibile variante dell'algoritmo ricerca il sottoalbero orientato di peso massimo.
Questo algoritmo è stato sviluppato in modo indipendente da Chu e Liu nel 1965 e da Jack Edmonds nel 1967. Edmonds ha fornito una dimostrazione della sua correttezza, piuttosto macchinosa e complessa, utilizzando procedimenti della programmazione lineare.
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+ 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 Gi = (V,Ai,w,a) e su alberi intermedi Tj = (Vj, A*j,w,a) che vengono man mano modificati.
All'inizio vengono eliminati gli archi entranti nella radice a, evidentemente estranei all'albero richiesto. Successivamente l'algoritmo opera in due fasi, dette rispettivamente di contrazione, o fase C, e di espansione, o fase E: durante una fase C si contrae il grafo Gi = (V,Ai,w,a) per eliminare i suoi eventuali cicli; durante la fase E si espande l'albero Tj = (Vj, A*j,w,a) per far riemergere i nodi dei cicli che erano stati contratti. Sia durante la fase di contrazione che durante la fase di espansione avviene la scelta degli archi presenti nella soluzione finale T* = (V,A*,w,a).
Consideriamo la fase di contrazione che accetta in ingresso il grafo G = (V,A,w,a) :
Consideriamo ora la fase di espansione che accetta in ingresso l'albero T1 = (V1, A*1,w,a) ottenuto al termine della precedente fase di contrazione:
Alla contrazione di ogni ciclo in un supernodo durante una fase C, corrisponde l'espansione di tale supernodo nel ciclo di partenza durante la fase E.
| Immagine | Descrizione |
|---|---|
| Grafo d'ingresso G = (V,A,w,a) | |
| [[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). |