Il problema dell'Accoppiamento Massimale nel caso seriale
L’Accoppiamento su un grafo Bipartito
Il problema dell’Accoppiamento per un grafo bipartito è un caso speciale discusso nel precedente capitolo  utilizzando il metodo sulla ricerca del cammino aumentante. La ricerca di un percorso aumentante deve cominciare costruendo un percorso alternante dai vertici scoperti. Poiché un percorso aumentante deve avere un estremo in V  e l’altro in U, senza perdere di generalità, si inizia con percorsi alternanti solo da vertici scoperti di  V ( per esempio v2 ) e ricercare tutti i possibili percorsi alternanti da v2 simultaneamente. Iniziando da v2 , si possono cercare percorsi alternanti considerando tutti i  vertici adiacenti a v2. Nel nostro caso chiamati u2 e u6. Finora si ha che v2 risulta scoperto, tutti i corrispondenti margini adiacenti risultano liberi. Dalla definizione di un percorso alternante, noi dobbiamo vedere gli archi accoppiati ad u2 e u6 .  Questo è un passo iniziale, fino adesso tutti i nodi hanno al più un nodo accoppiato. Naturalmente, se u2 o u6  fossero scoperti il nostro compito sarebbe quello di scoprire un percorso aumentante. Comunque, continuando con il caso preso in esame, addizioniamo il nodo v3 e v5 al nostro insieme composto dai nodi formanti i percorsi alternati. Per costruzione, v3 e v5 sono vertici esterni. Continuiamo, quindi, a sviluppare percorsi alternanti da v3 e v5 . Osserviamo che il nodo u3 è raggiunto da v3 , prima di analizzare v5 , omettiamo l’arco.  Scopriamo che i nuovi vertici esterni sono v4 , v1 e v6. Adesso finalmente si osserva che il vertice esterno v1 è adiacente al vertice esterno u1. Noi abbiamo così scoperto un percorso aumentante e quindi si può aumentare M  usando questo. L’idea della procedura di ricerca dei percorsi aumentanti è pensare ad una ricerca in ampiezza. Comunque, guardando indietro alla costruzione dei percorsi alternanti si può notare che questa prima ricerca in ampiezza ha una speciale struttura. Le ricerche dai livelli dispari sono di poca importanza perché solo il vertice successivo è quello accoppiato. E’ possibile così semplificare questa tecnica di ricerca ignorando i livelli dispari e andando direttamente dai vertici esterni ai nuovi vertici esterni. Nel nostro esempio, l’ideale è ricercare un procedimento come mostrato nella figura mobile dell' esempio. 
 Ovviamente, questo corrisponde a ricercare un diagramma  (V,A)  dove  (v1,v2) appartengono ad A  se e solo se v2 può essere il vertice esterno prossimo di v1 in un percorso aumentante;  v1 è adiacente all’accoppiato di v2 . L’insieme dei nodi di questo diagramma ausiliare è V, naturalmente soltanto i vertici di V possono diventare vertici esterni in percorsi alternanti avviati da V. 
La ricerca per percorsi aumentanti  può facilmente essere vista come una prima ricerca in ampiezza del grafo ausiliare avviato dal nodo v2 . 
 Il nostro potenziale algoritmo di ricerca dell’accoppiamento su un grafo assegnato bipartito si basa su due termini : accoppiato e scoperto. A fianco di questi si introduce il termine etichetta che serve poi per la ricerca. Il termine accoppiato ha    entrate e l’intenzione è quella di rappresentare l’accoppiamento corrente . Per ,   è un nodo di U che è scoperto ed è adiacente a v ; se tale nodo non esiste allora  scoperto[v]=0. Ovviamente, se un nodo   con    è incontrato nella nostra ricerca, noi abbiamo scoperto un percorso aumentante. La procedura aumentante è ricorsiva. 
Teorema1
L’algoritmo in questione risolve il problema dell’Accoppiamento per un grafo bipartito B=(V,U,E)  in O(min(|V|,|U|)|E|)   tempo. 

Il problema dell’Accoppiamento bipartito e il flusso di reti
Nel paragrafo precedente si è visto come un algoritmo può risolvere il problema dell’Accoppiamento per un grafo bipartito in un tempo O(min(/V/,/U/)/E/) . E’ intenzione, in questa sezione, di migliorare la velocità. Per arrivare a questo fine conviene ridursi al problema del  massimo flusso per semplici reti. Di conseguenza, si può far vedere come risolvere il problema dell’accoppiamento bipartito in modo efficiente usando un algoritmo che risolve altrettanto efficientemente il problema del massimo flusso. 
Lemma1 :
La cardinalità del massimo accoppiamento in un grafo bipartito B è uguale al valore del massimo (s,t)-flusso in N(B). 

La dimostrazione del lemma 1 è di tipo costruttivo e permette di trovare il massimo accoppiamento di B da un flusso massimo in N(B) con un tempo O(/V/)  . 

Teorema2
E’ possibile risolvere il problema dell’accoppiamento per un grafo bipartito in un tempo O[sqrt(/V/) /E/]

Questo metodo è asintoticamente il più veloce algoritmo conosciuto per la risoluzione del problema dell’accoppiamento bipartito. 

Dato M un accoppiamento in un grafo G=(V,E) e sia T=(V’,E’) un albero alternante rispetto a M. Un albero fiorito si ottiene aggiungendo a T un arco, che non appartiene a M, tra due nodi marcati. I nodi e gli archi facenti parte del ciclo sono in numero dispari e costituiscono il fiore dell’albero. L’unico nodo del fiore lasciato scoperto dagli archi del fiore stesso viene detto gambo del fiore. 
Se un grafo non è fiorito rispetto al corrente accoppiamento, allora vuol dire che esso è effettivamente bipartito. Analogamente anche quando il grafo ammette circuiti disaccoppiati non fioriti come in figura 9  può essere effettuata una ricerca dei percorsi aumentanti come nel caso bipartito. Di conseguenza la modifica del nostro algoritmo si basa sulla presenza di un albero fiorito e quindi la ricerca di validi cammini aumentanti. Per mantenere semplice l’algoritmo, è sufficiente cercare percorsi aumentanti che partono da un vertice scoperto alla volta come l’opposto a tutti i vertici scoperti simultaneamente. Verificare l’esistenza della fioritura non è particolarmente complicato. Una fioritura diventa rilevante per il nostro algoritmo se prima viene individuata. Un caso, quest’ultimo, che avviene quando tutti i suoi vertici sono entrambi esterni o accoppiati di vertici esterni. Questa situazione è evidenziata in figura 11 per il grafo fiorito della figura 10. 
 
Accoppiamento in un grafo non bipartito
Dato M un accoppiamento in un grafo G=(V,E) e sia T=(V’,E’) un albero alternante rispetto a M. Un albero fiorito si ottiene aggiungendo a T un arco, che non appartiene a M, tra due nodi marcati. I nodi e gli archi facenti parte del ciclo sono in numero dispari e costituiscono il fiore dell’albero. L’unico nodo del fiore lasciato scoperto dagli archi del fiore stesso viene detto gambo del fiore. 
Se un grafo non è fiorito rispetto al corrente accoppiamento, allora vuol dire che esso è effettivamente bipartito. Analogamente anche quando il grafo ammette circuiti disaccoppiati non fioriti come in figura 9  può essere effettuata una ricerca dei percorsi aumentanti come nel caso bipartito. Di conseguenza la modifica del nostro algoritmo si basa sulla presenza di un albero fiorito e quindi la ricerca di validi cammini aumentanti. Per mantenere semplice l’algoritmo, è sufficiente cercare percorsi aumentanti che partono da un vertice scoperto alla volta come l’opposto a tutti i vertici scoperti simultaneamente. Verificare l’esistenza della fioritura non è particolarmente complicato. Una fioritura diventa rilevante per il nostro algoritmo se prima viene individuata. Un caso, quest’ultimo, che avviene quando tutti i suoi vertici sono entrambi esterni o accoppiati di vertici esterni. 
L’algoritmo da costruire è una caratterizzazione del caso bipartito affrontato con il metodo dell’albero fiorito. Come al solito, l’avvio per la ricerca dell’accoppiamento è la soluzione vuota e successivamente si ricorre, più volte, alla ricerca di un percorso aumentante a partire da ogni vertice scoperto. La differenza sostanziale con il caso bipartito è nella ricerca di un cammino aumentante. In questa variante il percorso aumentante è cercato su un vertice scoperto alla volta e non da tutti insieme come fatto nel caso bipartito. Se da un nodo scoperto u il cammino aumentante non viene trovato, questo nodo non può più essere d’aiuto per un’idonea rappresentazione. 
Teorema 5:
L’algoritmo in questo caso  trova l’accoppiamento massimo in un grafo G=(V,E) in un tempo O(/V/**4)
 

 
 
Introduzione / Indice Capitolo ICapitolo II

Capitolo IIICapitolo VBibliografia

 Osservazioni: Gian Paolo Bulgarini