È possibile trasformare banalmente il proprio grafico in uno senza loop con bordi singoli e bordi paralleli.
Con loop single-edge è necessario verificare se il loro peso è negativo o non negativo. Se il peso è negativo, ovviamente non esiste un percorso più breve, poiché è possibile continuare a ruotare e ridurre la lunghezza del percorso oltre ogni limite. Se tuttavia il peso è positivo, puoi gettare via quel bordo, poiché nessun percorso più breve può attraversare quel bordo.
Un margine di peso zero creerebbe un problema simile a qualsiasi altro ciclo di peso zero: non ci sarà uno, ma un numero infinito di percorsi più brevi, che attraversano lo stesso ciclo più e più volte. In questi casi la cosa sensata è di nuovo di rimuovere il bordo dal grafico.
Fuori dai bordi paralleli è possibile gettare via tutti tranne uno con il peso più basso. Il ragionamento per questo è altrettanto semplice: se c'è un percorso più breve che attraversa un bordo A
con un margine parallelo B
con un peso inferiore, è possibile costruire un percorso ancora più breve semplicemente sostituendo A
con B
. Pertanto, nessun percorso più breve può passare attraverso A
.
Come le risposte citate, dipende molto dalla particolare implementazione dell'algoritmo dijkstra. [Questo] (https: //www.quora.com/What-is-the-most-simple-efficient-C% 2B% 2B-code-per-Dijkstras-shortest-path-algorithm/answer/Michal-Fori% C5% A1ek? srid = ojqI) l'implementazione funzionerà bene perché aggiunge il bordo più piccolo possibile tra tutti i possibili bordi paralleli alla struttura dati che si sta utilizzando per tenere traccia dei nodi ancora da esplorare. – thebenman