Questo problema può essere ridotto a un problema grafico bipartito .
Grafici bipartito
Se i vertici di un grafico possono essere divisi in due gruppi, ad esempio
- non esiste uno spigolo tra due vertici nello stesso gruppo
- (per ogni nodo, c'è un bordo che lo collega a un vertice dell'altro gruppo)
Riassunto
Notiamo che
- le persone verranno suddivise in due gruppi
- solo le persone in diversi gruppi condividono una sorta di relazione l'una con l'altra
Sapendo che un grafico (non orientato) è semplicemente una visualizzazione di una relazione (simmetrica) e una partizione dei suoi oggetti (cioè persone) in due gruppi, e tutti gli spigoli connettono i vertici di gruppi diversi, possiamo vedere che questo in infatti si qualifica come un grafico bipartito, se tale partizionamento è effettivamente possibile.
Concludiamo che dobbiamo solo determinare, se si tratta di un grafico bipartito (rilassato). Rilassato, perché nella definizione corretta, ogni vertice deve avere almeno un bordo, ma il problema non specifica se questo è il caso. Questo è il motivo per cui (2) è tra parentesi.
Rilevamento di un grafico bipartito
Questo può essere fatto con una BTH (breadth-first-search) di un algoritmo DFS (depth-first-search).
- Possiamo posizionare il primo vertice nel gruppo # 1. (Non importa quale)
- Fatto ciò, è chiaro che tutti i suoi vicini devono essere inseriti nel gruppo n. 2, poiché i vicini sono quelli che hanno lavorato con la prima persona. Pertanto, potrebbero non essere nel gruppo # 1.
- Allo stesso modo, mettiamo tutti i vicini dei vicini nel gruppo # 1
- Continuando allo stesso modo, assegniamo i nodi ai due diversi gruppi.
Tuttavia, nel caso in cui non sia possibile formare un grafico bipartito, dobbiamo dover inciampare su un nodo quando proviamo ad assegnarlo al gruppo X, che era già assegnato ad un gruppo, ma non gruppo X. In tal caso, è impossibile formare due gruppi di dipendenti in cui nessuno ha mai lavorato prima.
Modifica DFS / BFS
Dopo aver scoperto un nodo adiacente, lo posizioniamo nel gruppo opposto del nodo attivo al momento, se non ne è stato ancora assegnato uno.
Se è già stato assegnato allo stesso nodo, sappiamo che è impossibile formare un grafico bipartito.
Altrimenti, è già stato inserito in una regola conforme al gruppo (1) di un grafico bipartito.
Gestione della regola (2)
Nel caso in cui la regola (2) non sia effettiva, ovvero il grafico ha più di componenti collegati , DFS / BFS terminerà prima di aver assegnato tutti i nodi a un gruppo.
In tal caso, l'algoritmo viene semplicemente eseguito nuovamente su un nodo non ancora assegnato, fino a quando non viene lasciato alcun nodo.
Ottenere tutte le soluzioni
Nel caso in cui la regola (2) non sia in vigore, esistono più di due sole soluzioni. Per un grafico con componenti c
collegati, (cioè l'algoritmo DFS / BFS è stato eseguito c
volte), ci sono 2 c
soluzioni.
Per questo, dobbiamo distinguere tra i due gruppi creati da ogni invocazione dell'algoritmo BFS / DFS: g c
, 1 e g c
, 2 per eseguire c
.
Dopo aver eseguito l'algoritmo c
volte, distribuiamo le coppie c
a due gruppi, in cui i dipendenti vengono separati, liberamente.