Ecco un'accisa:grafico - Come trovare il ciclo minimo diretto (peso totale minimo)?
Sia G un grafo orientato zavorrato con n vertici e m bordi, dove tutti i bordi hanno un peso positivo. Un ciclo diretto è un percorso diretto che inizia e finisce nello stesso vertice e contiene almeno un bordo. Dare un algoritmo O (n^3) per trovare un ciclo diretto in G di peso totale minimo. Verrà fornito un credito parziale per un algoritmo O ((n^2) * m).
Ecco il mio algoritmo.
Faccio uno DFS
. Ogni volta che trovo uno back edge
, so di avere un ciclo diretto.
Quindi passerò temporaneamente indietro lungo lo parent array
(fino a quando percorrerò tutti i vertici del ciclo) e calcolerò lo total weights
.
Quindi confronto lo total weight
di questo ciclo con min
. min
prende sempre il peso totale minimo. Al termine del DFS, viene trovato anche il nostro ciclo minimo diretto.
Ok, quindi circa la complessità del tempo.
Per essere onesto, non conosco la complessità temporale del mio algoritmo.
Per DFS, l'attraversamento prende O (m + n) (se m è il numero di spigoli e n è il numero di vertici). Per ogni vertice, potrebbe puntare a uno dei suoi antenati e quindi formare un ciclo. Quando viene trovato un ciclo, prende O (n) per riassumere i pesi totali.
Quindi penso che il tempo totale sia O (m + n * n). Ma ovviamente è sbagliato, come indicato nell'accisa il tempo ottimale è O (n^3) e il tempo normale è O (m * n^2).
Qualcuno mi può aiutare con:
- È il mio algoritmo corretto?
- Qual è la complessità temporale se il mio algoritmo è corretto?
- Esiste un algoritmo migliore per questo problema?
Non è chiaro a cosa stai chiedendo aiuto. Stai chiedendo aiuto per determinare la tua complessità temporale? – Keeblebrox
Ok, ho modificato la mia domanda –
Il tuo algoritmo è incompleto. Cosa fai se incontri un vertice che hai già visto? –