Un algoritmo greedy che potrebbero fallire su alcuni casi, ha bisogno di revisione tra pari.
Si noti che, se abbiamo un ciclo di una certa lunghezza k
:
1 -> 2 -> 3 -> ... -> k -> 1
Possiamo fare un altro ciclo della stessa lunghezza con l'introduzione di un unico altro nodo:
1 -> 2 -> 3 -> ... -> k -> 1
k' -> 1 -> 2 -> ... -> k - 1 -> k'
O un ciclo della stessa lunghezza - 1:
Questo può andare avanti per rever introducendo sempre un nuovo nodo e collegandolo ad altri due nodi in un ciclo iniziale abbastanza grande.
Quindi, se puoi permetterti un numero infinito di nodi, fai questo, partendo dal ciclo più grande che ti serve.
Se si deve lavorare con un numero fisso di nodi, dovremmo cercare di ridurre al minimo il numero di nodi utilizzati per la costruzione dei cicli richiesti. Eventuali nodi rimanenti possono essere facilmente aggiunti in modo da non formare alcun ciclo.
Inizia con la più grande ciclo nuovamente:
1 -> 2 -> ... -> k -> 1
non aggiungendo alcuna più nodi, si può ottenere da questo seguente:
k
lunghezza 2
cicli: 2 -> 1, 3 -> 2, ... 1 -> k
.
k - 2
lunghezza 3
cicli: 3 -> 1, 4 -> 2, ..., k -> k - 2
.
In generale, k - p + 1
cicli p
cicli.
Nessuno di questi genererà cicli aggiuntivi. Quindi l'intero algoritmo sarà:
Costruisci il tuo ciclo più grande richiesto.
1.1. Se ne esiste più di uno, costruisci di più aggiungendo un singolo nuovo nodo per ciascuno. Si noti che ciò influisce sulla procedura descritta per la creazione di cicli più piccoli rispetto a quelli grandi non aggiungendo nuovi nodi, poiché si ottiene un nuovo ciclo di una certa dimensione. Ci saranno alcune sovrapposizioni, quindi non si può semplicemente raddoppiare il numero di soluzioni. Per quanto ne so, aumenta solo il numero di 1.
Costruisci i tuoi cicli minori non aggiungendo nuovi nodi.
se non fatto costruire i cicli necessari:
3.1. Se hai ancora nodi, usali.
3.2. Se non si dispone di nodi rimasti, emettere no solution
.
se fatto cicli di costruzione:
4,1. Se hai ancora nodi, aggiungili come lista collegata da qualche parte in modo che non ti infastidiscano.
4.2. Se non ci sono nodi rimasti, hai finito.
è il numero di vertici fisso? – svs
questa è una domanda interessante. – dashnick
sì, l'algoritmo ha il numero di vertici come parametro di input. –