Modifica: La mia altra risposta è migliore di questa; guarda invece quello.
Il problema può essere rappresentato creando una griglia piena di punti. La griglia ha:
-
N righe, una per ogni persona.
-
M colonne, una per ogni articolo.
- Un punto verde ogni volta che una persona è disposta a dare un elemento (perché "dare" inizia con "G" per "verde"). Ad esempio, se Bob è disposto a scambiare fino a tre mele, quindi inserisci 3 punti verdi nella cella della griglia che si trova nella riga che rappresenta Bob e la colonna che rappresenta le mele.
- Un punto rosso ogni volta che una persona desidera ricevere un elemento.
(In termini matematici, sarebbero due matrici N × M , chiamate G e R . )
Ecco un algoritmo per risolvere il tuo problema. Probabilmente non è l'algoritmo migliore , ma è un algoritmo an .
In primo luogo, trasforma la griglia in un grafico orientato seguendo questi due passaggi:
- Disegna una freccia da ogni punto verde a ogni punto rosso nella stessa colonna (a indicare che una persona può dare un oggetto e un'altra la persona può riceverlo).
- Disegna una freccia da ogni punto rosso a ogni punto verde nella stessa riga (a indicare che una persona può ricevere un oggetto e un altro oggetto).
In secondo luogo, trova un ciclo diretto nel grafico. Questo ciclo fornisce la risposta.
Ad esempio, supponi che Bob abbia una mela e desideri un'arancia e che Sarah abbia un'arancia e desideri una mela. La griglia conterrà
- un punto verde per (Bob, mela),
- un punto verde per (Sarah, arancione),
- un punto rosso per (Bob, arancione) e
- un punto rosso per (Sarah, mela).
Il ciclo che troviamo
- inizia dal punto verde (Bob, mela) e passa al punto rosso (Sarah, mela) (Bob dà una mela e Sarah lo riceve);
- passa dal punto rosso (Sarah, mela) al punto verde (Sarah, arancione) (dal momento che Sarah ha ricevuto una mela, è disposta a dare un'arancia);
- passa dal punto verde (Sarah, arancione) al punto rosso (Bob, arancione) (Sarah dà un'arancia a Bob); e
- ritorna dal punto rosso (Bob, arancione) al punto verde (Bob, mela) (Bob ha ricevuto un'arancia e quindi è disposto a mollare una mela).