Mi piacerebbe viaggiare in auto dalla città X alla città Y. La mia auto ha un piccolo serbatoio, e le stazioni di servizio esistono solo agli incroci delle strade (le intersezioni sono nodi e le strade sono bordi). Pertanto, vorrei prendere un percorso tale che la distanza massima che guido tra due stazioni di servizio sia ridotta al minimo. Quale algoritmo efficiente posso usare per trovare quel percorso? La forza bruta è una cattiva soluzione. Mi chiedo se esiste un algoritmo più efficiente.Algoritmo per trovare il percorso che minimizza il peso massimo tra due nodi
risposta
Ecco una soluzione semplice:
Ordina i bordi di loro pesi.
Iniziare ad aggiungerli uno a uno (dal più leggero al più pesante) fino a quando
X
eY
diventano connessi.Per verificare se sono collegati, è possibile utilizzare una struttura dati union-find.
La complessità del tempo è O(E log E)
.
Una prova di correttezza:
La risposta corretta non è più grande di quello restituito da questa soluzione. È il caso perché la soluzione è costruttiva: una volta che
X
eY
sono nello stesso componente, possiamo annotare esplicitamente il percorso tra di loro. Non può contenere bordi più pesanti perché non sono stati ancora aggiunti.La risposta corretta non è inferiore a quella restituita da questa soluzione. Supponiamo che vi sia un percorso tra
X
eY
costituito da bordi che hanno un peso strettamente inferiore alla risposta restituita. Ma non è possibile poiché tutti i bordi più chiari sono stati elaborati prima (li abbiamo iterati nell'ordine ordinato) eX
eY
erano in componenti diversi. Quindi, non c'era alcun percorso tra loro.
1) e 2) implicano la correttezza di questo algoritmo.
Questa soluzione funziona per i grafici non orientati.
Ecco un'algoritmi che risolve il problema per un caso diretto (funziona per grafi non orientati, anche):
Diamo ordinare i bordi dei loro pesi.
Eseguiamo la ricerca binaria sul peso del bordo più pesante nel percorso (è determinato da un indice del bordo nell'elenco ordinato di tutti i bordi).
Per una risposta candidato fisso
i
, siamo in grado di effettuare le seguenti operazioni:Aggiungi tutti i bordi con gli indici fino a
i
nella lista ordinata (vale a dire, tutti i bordi che non sono più pesanti di quello attuale uno).Eseguire DFS o BFS per verificare che vi sia un percorso da
X
aY
.Regola i bordi sinistro e destro nella ricerca binaria in base all'esistenza di tale percorso.
la complessità temporale è O((E + V) * log E)
(corriamo DFS/BFS log E
volte e ciascuno di essi è fatto in O(E + V)
tempo).
Ecco un codice pseudo:
if (X == Y)
return 0 // We don't need any edges.
if (Y is not reachable from X using all edges)
return -1 // No solution.
edges = a list of edges sorted by their weight in increasing order
low = -1 // definitely to small(no edges)
high = edges.length - 1 // definitely big enough(all edges)
while (high - low > 1)
mid = low + (high - low)/2
g = empty graph
for i = 0...mid
g.add(edges[i])
if (g.hasPath(X, Y)) // Checks that there is a path using DFS or BFS
high = mid
else
low = mid
return edges[high]
- 1. Algoritmo per trovare il percorso in un albero non indirizzato
- 2. bisogno di assistenza con algoritmo per trovare il percorso massimo in un DAG
- 3. Trovare il percorso più breve tra due nodi appartenenti a due sottoinsiemi disgiunti di un grafico
- 4. Il modo migliore per trovare un percorso più breve tra due nodi in Tinkerpop 3.1
- 5. Come è chiamato questo algoritmo, per trovare il percorso massimo su un grafico Aciclico Diretto?
- 6. Algoritmo molto veloce per tutti i percorsi tra due nodi
- 7. Come trovare il percorso più lungo in un grafico ciclico tra due nodi?
- 8. Algoritmo per determinare il massimo divertimento
- 9. Ricerca di un algoritmo veloce per trovare la distanza tra due nodi nell'albero binario
- 10. Algoritmo per il massimo set non dominato
- 11. Modifica dell'algoritmo di Dijkstra per ottenere il percorso più breve tra due nodi
- 12. grafico - Come trovare il ciclo minimo diretto (peso totale minimo)?
- 13. Qual è il pattern/algoritmo più efficiente per confrontare due liste e trovare il delta tra queste due liste?
- 14. Trovare il valore minimo del cluster massimo?
- 15. Algoritmo veloce per trovare il numero di numeri primi tra due numeri
- 16. modo efficiente per trovare gradi di separazione tra i due nodi di un grafo
- 17. Il modo migliore per trovare il massimo e il minimo di due valori
- 18. Modo efficiente per trovare il set di nodi che ha relazioni con determinati nodi usando neo4j
- 19. Come trovare il numero massimo
- 20. algoritmo per trovare il più grande calo in un array
- 21. Il percorso più breve per visitare tutti i nodi
- 22. Ciclo del peso massimo in un grafico
- 23. Algoritmo set indipendente massimo
- 24. Algoritmo grafico per molti nodi
- 25. Come posso ottenere il massimo pairwise tra due vettori?
- 26. Algoritmo per trovare intersezioni tra polilinee
- 27. Algoritmo per trovare il gruppo ottimale di elementi compatibili
- 28. RegEx Come per trovare il testo tra due stringhe
- 29. Algoritmo per trovare un percorso Hamilton in un DAG
- 30. Cos'è un algoritmo veloce e stabile per un percorso casuale in un grafo di nodi?
Questo sembra giusto. Grazie. Lo contrassegnerò corretto dopo averlo convalidato, oppure puoi fornire una prova. –
Inoltre, puoi dirmi qual è il nome di questo algoritmo? –
@TravelingSalesman Ho aggiunto una prova. – kraskevich